为什么“捆绑安装”gem而不是“gem install”for rails 3 app?

时间:2011-09-01 17:08:04

标签: ruby-on-rails rubygems bundler railstutorial.org

我是初学者程序员,经过迈克尔哈特尔的railstutorial,并注意到在应用程序中使用gems的过程是通过将其添加到gemfile,然后执行:

$ bundle install

为什么人们不会只做一个:

$ [sudo] gem install [the_gem]

然后只需将其添加到Gem文件中?我知道这在轨道2中有点过程。

谢谢!

3 个答案:

答案 0 :(得分:39)

使用bundler而不是gem命令直接安装你的宝石可以带来很多好处。

在这种特殊情况下,您建议使用gem命令安装并稍后将其添加到Gemfile中,Bundler将在您安装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,看看后面有什么捆绑器为你做的。

答案 1 :(得分:4)

使用Gemfile,您可以确保在您的应用上工作的任何其他开发人员都拥有相同版本的每个gem。它还确保你没有在你的gem命令中添加不同的[the_gem]和你在Gemfile中的内容。

答案 2 :(得分:3)

某些宝石组合仅在特定环境中有意义 - 例如开发中的某个数据库和生产中的不同数据库。

Gemfile是您的应用程序在每个环境中需要的记录,bundle install完全安装所需的内容,并负责依赖。

如果Gemfile中的任何宝石已经安装在当前的gemset中(通过gem install),那么捆绑器将只使用它们(而不是重新安装它们)。