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

dar*_*rog 25 rubygems ruby-on-rails bundler railstutorial.org

我是一个初学编程的通过去railstutorial由迈克尔·哈特尔,并注意在应用程序中使用的宝石过程是通过将它添加到Gemfile中,然后做:

$ bundle install
Run Code Online (Sandbox Code Playgroud)

任何人不会这样做的原因:

$ [sudo] gem install [the_gem]
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

dex*_*ter 40

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

在您建议使用gem命令安装并稍后将其添加到Gemfile的特定情况下,Bundler将在您安装gem时为您解析所有依赖项,否则您可能需要手动解析.

举个例子,让我们采取以下依赖关系:

sunspot_rails
  nokogiri (>= 1.2.0)

webrat
  nokogiri (>= 1.3) 
Run Code Online (Sandbox Code Playgroud)

webrat和sunspot_rails宝石都需要不同版本的nokogiri作为依赖.如果您只是使用gem命令来安装它们,它可能会安装两个版本的nokogiri或更糟糕的抱怨版本冲突.Bundler将足够明智地解决这种依赖冲突并安装正确的版本(比如nokogiri 1.3)并使sunspot_rails和webrat都满意!

很抱歉很长的解释.但是,希望你明白这一点!:)

顺便说一下,你应该看一下这个文件Gemfile.lock,看看后面有什么捆绑器为你做的.


spi*_*ike 5

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


And*_*rea 5

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

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

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