【问题标题】:Why prawnto gem installs rails 3.x when there is already a rails 2.x?为什么已经有 rails 2.x 的 prawnto gem 安装 rails 3.x?
【发布时间】:2012-06-26 08:45:04
【问题描述】:

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

prawnto的依赖是:

prawn >= 0
rails >= 2.1

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

【问题讨论】:

    标签: ruby-on-rails rubygems


    【解决方案1】:

    tl;dr 使用 Bundler。它摇摆不定。

    好的,这基本上取决于 RubyGems 中依赖解析的工作方式。如果你不是很熟悉,get up to speed real quick like with the Primer panel from this XKCD comic。 RubyGems 依赖管理和 Primer 故事情节在复杂性方面非常相似。

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

    在撰写本文时,它将找到版本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 将找出所有在Gemfile 中指定的 gem 的依赖关系,以及它们所依赖的 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 上运行的那些。有一个 page on the Bundler website 可以帮助您开始使用 Rails 2.3 项目和 Bundler。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多