我安装了rails
(2.3.5) 和prawn
(0.12.0)。当我安装时prawnto
,gemrails
也会安装 3.2.6 版本。
的依赖prawnto
是:
prawn >= 0
rails >= 2.1
prawnto
当依赖项已经存在时,为什么要安装 Rails 3.x ?
我安装了rails
(2.3.5) 和prawn
(0.12.0)。当我安装时prawnto
,gemrails
也会安装 3.2.6 版本。
的依赖prawnto
是:
prawn >= 0
rails >= 2.1
prawnto
当依赖项已经存在时,为什么要安装 Rails 3.x ?
好吧,这基本上取决于依赖解析在 RubyGems 中的工作方式。如果您对它不是很熟悉,可以像使用此 XKCD 漫画中的 Primer 面板一样快速上手。RubyGems 依赖管理和 Primer 故事情节在复杂性方面非常相似。
当一个 gem 指定一个依赖项时,比如说rails >= 2.1
,当你去安装那个 gem 时,RubyGems 会方便地忽略你当前安装的所有 gem,然后查询 Web API 以找到大于或等于的绝对最新版本的 Rails到2.1
.
在撰写本文时,它将找到 version 3.2.6
,因此会尽职地安装该版本的 Rails,因为它符合依赖项要求。它还将安装 Rails 的每一个依赖项,以及它们的依赖项,以及子子子子子依赖项,直到没有一个 gem 没有安装依赖项。
我不会详细说明它是如何工作的,因为当我想到它时,它会让我的视线变得模糊。
现在,如果您使用的不是纯 RubyGems,例如 Bundler,您将能够拥有这样的 Gemfile:
source 'http://rubygems.org'
gem 'rails', '2.3.4'
gem 'prawnto', '0.1.1'
然后运行bundle install
,然后会发生一些神奇的事情。Bundler 将找出所有在 中指定的 gem 的依赖关系Gemfile
,以及它们所依赖的 gem,然后只安装这些 gem。
这意味着如果您prawnto
想要 Rails >= 2.1
,它不会安装 3.2.6 因为还有另一个依赖项说 Rails必须精确地是 2.3.4
。因此,将安装 Rails 2.3.4。
如果您有冲突的版本,并且 gem A 指定了对 gem B 的依赖项~> 1.0
,但是 gem C 指定了 gem B 必须为 '= 0.5.0' 的依赖项,Bundler 将不会很高兴并且会引发错误,因为无法解决依赖关系。
我真的建议对所有 Rails 项目使用 Bundler。即使是在 Rails 2 上运行的那些。Bundler 网站上有一个页面可以帮助您开始使用 Rails 2.3 项目和 Bundler。