31

我是一名初学者程序员,正在阅读 michael hartl编写的 railstutorial,并注意到在应用程序中使用 gems 的过程是通过将其添加到 gemfile 中,然后执行以下操作:

$ bundle install

一个人不只是做的任何理由:

$ [sudo] gem install [the_gem]

然后将其添加到 Gem 文件中?我知道这在某种程度上是 rails 2 中的过程。

谢谢!

4

3 回答 3

50

使用 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 在幕后为你做了什么。

于 2011-09-01T17:21:11.110 回答
5

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

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

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

于 2011-09-01T17:28:57.423 回答
5

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

于 2011-09-01T17:20:28.020 回答