为什么当gemspec声明一个开放约束时,bundler会坚持一个确切的gem版本号?

我正在为Ruby gem koudoku做贡献,并试图让Travis CI工作。

几天前使用Travis设置了gem,但是所有构建都失败并出现此错误消息( 示例 ):

Bundler could not find compatible versions for gem "rack": In Gemfile: rspec-rails (~> 2.14.0) ruby depends on actionpack (>= 3.0) ruby depends on rack (~> 1.2.1) ruby capybara (>= 0) ruby depends on rack (1.0.0) 

gemspec中的违规行是:

 s.add_development_dependency "rspec-rails", "~> 2.14.0" s.add_development_dependency 'capybara' 

我分叉了gem并更改了第二行所以它需要capybara版本>= 2.4.0 ,但是当我在Travis上运行我自己的构建时,我得到完全相同的错误 。

令我最困惑的是,当你查看Capybara自己的gemspec时,你可以看到它并没有说明它完全取决于机架版本1.0.0 。 真正的依赖是机架版本>= 1.0.0

为什么Bundler坚持1.0.0时Capybara本身不需要这个? 我怎样才能让Travis运行测试?

我必须承认,这不是特拉维斯特有的问题。

 ⌚ 17:10:45 ▷ /tmp/koudoku ▷ ⭠ master ▷ bundle Fetching gem metadata from http://rubygems.org/....... Resolving dependencies........ Bundler could not find compatible versions for gem "rack": In Gemfile: rspec-rails (~> 2.14.0) ruby depends on actionpack (>= 3.0) ruby depends on rack (~> 1.2.1) ruby capybara (>= 0) ruby depends on rack (1.0.0) 

这就是我在git clone clone’d koudoku并在新下载的源上运行bundle时发生的事情。 这发生在ruby 2.1.5 ,但Travis在1.9.3上遇到了同样的问题。

看起来你已经以某种方式调整了你的gem以使它们工作,而从头开始的过程被打破了。 我不知道为什么rack >= 1.0.0不能用于1.2.1 ,但我建议你清理你的系统(使用rvm或类似创建新的gemset)并尝试使本地工作。

很抱歉发布这个作为答案,但它太长,不适合“评论”字段。

希望能帮助到你。

版本:

 ▷ rvm --version rvm 1.26.2 (master) by Wayne E. Seguin , Michal Papis ▷ gem --version 2.4.4 ▷ bundle --version Bundler version 1.7.6 

UPD由于未知原因将此行添加到gemspec会导致无限的Resolving dependencies点打印:

  s.add_development_dependency "rack", "~> 1.2.1"