为什么Bundler会反复选择需要更新版本Ruby的宝石

时间:2018-04-04 20:35:35

标签: ruby-on-rails ruby rubygems bundler

我刚刚开始为客户端开发一个非常古老的遗留应用程序,该应用程序运行在Ruby 1.9.3,Rails 3.2上,并在生产服务器上使用JRuby。 (升级服务器的障碍一直是保持1.9.3的原因。)

将宝石添加到Gemfile中,即使宝石与1.9.3兼容,即使我已添加

ruby '1.9.3', :patchlevel => '551'

到Gemfile的顶部,Bundler不断选择需要Ruby 2.0的其他gem的版本,因此更新失败。如何解决这个问题,而无需手动指定它失败的每个单个gem版本。

例如:

...
Using quiet_assets 1.1.0
Using rails 3.2.22
Using ref 2.0.0
Using rspec-rails 2.14.2
Fetching rspec_junit_formatter 0.3.0 (was 0.2.3)
Installing rspec_junit_formatter 0.3.0 (was 0.2.3)
Gem::InstallError: rspec_junit_formatter requires Ruby version >= 2.0.0.
An error occurred while installing rspec_junit_formatter (0.3.0), and Bundler cannot continue.
Make sure that `gem install rspec_junit_formatter -v '0.3.0'` succeeds before bundling.

我必须指定gem 'rspec_junit_formatter', '0.2.3' 以及所有以前的失败 ,才能使其正常运行。但这似乎打败了Bundler的目的。为什么Bundler在构建依赖图时会忽略Ruby版本,即使我已明确告诉它使用哪个版本的Ruby?

1 个答案:

答案 0 :(得分:0)

Bundler并没有忽略ruby版本。当它安装gems时,它不会查看每个gem,并选择哪一个选择去除任何依赖性问题(包括ruby版本依赖项)。

在你的gemfile中,通过不指定gem版本,bundler将尝试安装它可以的最高版本。这就是为什么为所有宝石指定确切版本的好习惯 - 这样如果在回购中出现宝石的更新,你就会得到宝石 - 你的项目不会破坏。

在gem文件中指定ruby版本就像为特定gem指定gem版本一样安装该版本但不影响任何其他gem的安装。