为什么在Rails 3应用程序中要使用"bundle install"安装gem而不是"gem install"?

31

我是一名新手程序员,正在学习 Michael Hartl 的 railstutorial。我注意到在应用程序中使用 gem 的过程是通过将它添加到 Gemfile 中,然后执行以下操作:

$ bundle install

有没有任何理由不直接执行以下操作:

$ [sudo] gem install [the_gem]

那么只需将它添加到 Gem 文件中即可吗?我知道在 Rails 2 中这在某种程度上是该过程。

谢谢!

3个回答

50

使用Bundler代替gem命令直接安装您的gems会带来很多好处。

在这种情况下,您建议使用gem命令进行安装,并稍后将其添加到Gemfile中。当您安装一个gem时,bundler会为您解决所有依赖关系,否则您可能需要手动解决。

举个例子,让我们看一下以下依赖关系:

sunspot_rails
  nokogiri (>= 1.2.0)

webrat
  nokogiri (>= 1.3) 

webrat和sunspot_rails两个gem包都需要nokogiri的不同版本作为依赖项。如果您仅使用gem命令安装它们,则可能会安装nokogiri的两个版本或更糟糕的是出现版本冲突的问题。Bundler将明智地解决此依赖关系冲突并安装正确的版本(比如nokogiri 1.3),使sunspot_rails和webrat都能够正常运行!

很抱歉解释比较长。但是,希望你已经明白了重点! :)

顺便说一下,您应该查看Gemfile.lock文件,了解Bundler在后台为您执行的操作。


5
使用Gemfile,您可以确保任何其他开发人员在应用程序上工作时具有每个gem的相同版本。它还确保您在Gemfile中拥有与gem命令中不同的[the_gem]。

5

有些宝石组合只在特定的环境下才有意义 - 例如在开发中使用某个数据库,在生产中使用不同的数据库。

Gemfile 记录了应用程序在每个环境中所需的内容,bundle install 安装了确切需要的内容,并处理依赖关系。

如果 Gemfile 中的任何宝石已经通过 gem install 安装在当前 gemset 中,则 bundler 将直接使用它们(而不是重新安装)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接