为什么Bundler认为它需要一个特定的版本来满足gem的依赖?

时间:2012-12-26 21:02:40

标签: ruby bundler gemfile

这不是我第一次碰到这个,但这是一个具体的例子:

$ bundle update rails
Fetching source index for http://rubygems.org/
Bundler could not find compatible versions for gem "builder":
  In Gemfile:
    rails (~> 3.0.0) ruby depends on
      builder (~> 2.1.2) ruby

    hoptoad_notifier (>= 0) ruby depends on
      builder (3.0.0)

所以Bundler声称hoptoad_notifier gem依赖于3.0.0版本的构建器。但事实并非如此,它只需要构建器> = 0。

$ gem dependency hoptoad_notifier
Gem hoptoad_notifier-2.4.11
  actionpack (>= 0, development)
  activerecord (>= 0, development)
  activesupport (>= 0, runtime)
  bourne (>= 0, development)
  builder (>= 0, runtime)
  nokogiri (>= 0, development)
  shoulda (>= 0, development)

为什么Bundler认为hoptoad_notifier依赖于builder 3.0.0?

Gemfile和Gemfile.lock中的选定位:

source "http://rubygems.org"

gem 'rails', '~> 3.0.0'
gem 'hoptoad_notifier'
...a bunch of testing gems, custom gems, etc.

Gemfile.lock的

GEM
  remote: http://rubygems.org/
  specs:
    actionmailer (2.3.14)
      actionpack (= 2.3.14)
...
    builder (3.0.0)
...
    cucumber (1.2.0)
      builder (>= 2.1.2)
      diff-lcs (>= 1.1.3)
      gherkin (~> 2.10.0)
      json (>= 1.4.6)
...
    hoptoad_notifier (2.4.11)
      activesupport
      builder
... no other mentions of builder

1 个答案:

答案 0 :(得分:2)

我认为这更像是一个解决方法,而不是问题的答案,所以我会暂时搁置这个问题,看看是否有更好的答案。

我找到了不同的方法来解决问题(使用特定gems上的bundle更新,修改Gemfile,运行bundle install),但是对于各种依赖项继续遇到某种形式的此错误。这似乎是Bundler的一个问题。 (我正在使用v1.0.22,升级让它变得更糟。)最终,让我摆脱困境的是删除Gemfile.lock并运行bundle install,让Bundler从头开始解析所有依赖项。当然,这远非理想,因为你有一个锁文件的全部原因是锁定你的应用程序的依赖项。但是因为我无论如何都要将Rails升级到v3,在这种情况下它是可以接受的。