我是一個初學編程的通過railstutorial由邁克爾·哈特爾去,並注意在應用程序中使用的寶石過程是通過將它添加到Gemfile中,然後做一個:爲什麼「捆綁安裝」一個用於rails 3應用程序的gem而不是「gem install」?
$ bundle install
任何理由一個不會只是做一個:
$ [sudo] gem install [the_gem]
然後只是將它添加到Gem文件?我知道這是有點回到軌道2的過程。
謝謝!
我是一個初學編程的通過railstutorial由邁克爾·哈特爾去,並注意在應用程序中使用的寶石過程是通過將它添加到Gemfile中,然後做一個:爲什麼「捆綁安裝」一個用於rails 3應用程序的gem而不是「gem install」?
$ bundle install
任何理由一個不會只是做一個:
$ [sudo] gem install [the_gem]
然後只是將它添加到Gem文件?我知道這是有點回到軌道2的過程。
謝謝!
通過Gemfile,您可以確保任何其他開發人員也可以在您的應用上使用每個gem的相同版本。它還可以確保你沒有從Gemfile中的gem命令中放入不同的[the_gem]。
使用bundler而不是gem命令來直接安裝你的寶石給你一大堆好處。
在這種特定情況下,如果您建議使用gem命令安裝並稍後將其添加到Gemfile中,bundler將在您安裝gem時解析所有依賴項,否則您可能必須手動解析該gem。
給你舉個例子,我們採取以下依存關係:
sunspot_rails
nokogiri (>= 1.2.0)
webrat
nokogiri (>= 1.3)
兩個webrat和sunspot_rails寶石需要不同版本引入nokogiri作爲依賴。如果您只是使用gem命令來安裝它們,它可能會安裝nokogiri的兩個版本,或者更糟糕地抱怨版本衝突。 Bundler將足夠明智地解決這種依賴衝突並安裝正確的版本(比如說nokogiri 1.3),並且讓sunspot_rails和webrat都快樂!
對不起,很長的解釋。但是,希望你明白這一點! :)
而順便說一句,你應該看看這個文件Gemfile.lock
看看什麼bundler在幕後爲你做。
一些寶石組合僅在特定環境中才有意義 - 例如,開發中有一定的分貝,生產中也有不同的分貝。
Gemfile是您的應用程序在每個環境中需要的記錄,並且bundle install
正好安裝所需的內容,負責依賴關係。
如果您的Gemfile中的任何寶石已經安裝在您當前的gemset中(通過gem install
),那麼捆綁器將使用它們(而不是重新安裝它們)。