为什么prawnto gem在已经存在rails 2.x的情况下安装rails 3.x?

ohh*_*hho 0 rubygems ruby-on-rails

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

依赖性prawnto是:

prawn >= 0
rails >= 2.1
Run Code Online (Sandbox Code Playgroud)

为什么gem在prawnto依赖已经存在时安装Rails 3.x ?

Rya*_*igg 7

tl; dr使用Bundler.它摇滚.

好吧,这基本上取决于依赖解析如何在RubyGems中工作.如果你对它不是非常熟悉的话,可以通过XKCD漫画中的Primer面板快速加快速度.RubyGems依赖管理和Primer故事情节在复杂性方面非常相似.

当gem指定一个依赖项,比如rails >= 2.1当你去安装那个gem时,RubyGems会方便地忽略你当前安装的所有gem,然后查询web API以找到大于或等于Rails的绝对最新版本到2.1.

在撰写本文时,它会发现版本3.2.6,因此它将尽职尽责地安装该版本的Rails,因为它符合依赖性要求.它还将安装Rails的每个依赖项及其依赖项以及子子子依赖项,直到没有安装依赖项的情况下没有剩下的gem.

我不会深入研究它是如何工作的,因为当我想到它时,它会让我的视野变得模糊.


现在,如果您使用的东西不是像Bundler这样的纯RubyGems,那么您将能够拥有这样的Gemfile:

source 'http://rubygems.org'
gem 'rails', '2.3.4'
gem 'prawnto', '0.1.1'
Run Code Online (Sandbox Code Playgroud)

然后运行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将不会很高兴并且会引发错误,因为依赖关系无法解决.


我真的建议您使用Bundler来完成所有Rails项目.即使是在Rails 2上运行的那些.Bundler网站上有一个页面,它将帮助您开始使用Rails 2.3项目和Bundler.