【问题标题】:Why "bundle install" a gem instead of "gem install" for a rails 3 app?为什么要为 rails 3 应用程序“捆绑安装”gem 而不是“gem install”?
【发布时间】:2011-09-01 17:08:03
【问题描述】:
我是一名初级程序员,正在浏览 michael hartl 的 railstutorial,并注意到在应用程序中使用 gems 的过程是将其添加到 gemfile 中,然后执行以下操作:
$ bundle install
任何不做的理由:
$ [sudo] gem install [the_gem]
然后将其添加到 Gem 文件中?我知道这在某种程度上是 Rails 2 中的过程。
谢谢!
【问题讨论】:
标签:
ruby-on-rails
rubygems
bundler
railstutorial.org
【解决方案1】:
使用 bundler 代替 gem 命令来直接安装你的 gem 会给你带来很多好处。
在您建议使用 gem 命令安装并稍后将其添加到 Gemfile 的这种特定情况下,bundler 将在您安装 gem 时为您解析所有依赖项,否则您可能必须手动解决。
举个例子,我们来看看下面的依赖:
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 在幕后为你做了什么。
【解决方案2】:
使用 Gemfile,您可以确保任何其他开发您的应用程序的开发人员都拥有相同版本的每个 gem。它还确保您没有在 gem commmand 中放置与 Gemfile 中不同的 [the_gem]。
【解决方案3】:
某些宝石组合仅在特定环境中有意义 - 例如开发中的某个数据库和生产中的不同数据库。
Gemfile 记录了您的应用程序在每个环境中的需求,bundle install 会准确安装所需的内容,并处理依赖关系。
如果您的 Gemfile 中的任何 gem 已经安装在您当前的 gemset 中(通过gem install),那么捆绑器将只使用它们(而不是重新安装它们)。