0

我安装了rails(2.3.5) 和prawn(0.12.0)。当我安装时prawnto,gemrails也会安装 3.2.6 版本。

的依赖prawnto是:

prawn >= 0
rails >= 2.1

prawnto当依赖项已经存在时,为什么要安装 Rails 3.x ?

4

1 回答 1

7

tl;博士使用捆绑器。它摇摆不定。

好吧,这基本上取决于依赖解析在 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。

于 2012-06-25T05:39:36.790 回答