【问题标题】:Why is Bundler repeatedly choosing gems that require a newer version of Ruby为什么 Bundler 反复选择需要更新版本 Ruby 的 gem
【发布时间】:2018-04-04 20:35:34
【问题描述】:

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

向 Gemfile 添加 gem,即使 gem 与 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?

【问题讨论】:

  • 2014 年的评论让我有点惊讶:github.com/bundler/bundler/issues/2965#issuecomment-39469017
  • ????哇,这令人惊讶,尤其是声称捆绑器构建失败的依赖关系图不是错误,因为它从未关注过过去的 Ruby 版本。我想这是一个很好的例子,说明不同的人对什么是错误有完全不同的想法。在我看来,它在执行其一项工作时总是无法处理某个用例这一事实并不能改变它未能完成其一项工作的事实。但后来……我猜他和我对工作的定义不同……

标签: ruby-on-rails ruby rubygems bundler


【解决方案1】:

Bundler 不会忽略 ruby​​ 版本。当它安装 gem 时,它不会查看每个 gem,而是明智地选择选择哪一个来摆脱任何依赖问题(包括 ruby​​ 版本依赖)。

在您的 gemfile 中,通过不指定 gem 版本,bundler 将尝试安装它可以安装的最高版本。这就是为什么最好为所有 gem 指定确切的版本 - 这样,如果 repo 中的 gem 出现更新,您将从中获取 gem - 您的项目不会中断。

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

【讨论】:

  • “这就是为什么最好为所有 gem 指定确切的版本”——如果我必须弄清楚每个 Gem 的确切版本,那么我必须在让 Bundler 之前完成 Bundler 的工作做它的工作。我为什么要这样做?
  • “这样,如果 repo 中的 gem 有更新,你就可以从中获取 gem——你的项目不会中断。”——这就是 Gemfile.lock 的用途。它跟踪确切的版本。如果一个新版本破坏了我的代码,那么我就有了在它出现之前不存在的新信息,然后我可以在 Gemfile 中指定不使用该版本。
  • "Bundler 没有忽略 ruby​​ 版本。"我不确定你的意思是什么。从问题的第一条评论中链接到的 GitHub 问题中,我似乎很清楚 Bundler 在构建依赖关系图时没有考虑 Ruby 版本。所以,至少在它运行的那个时候,它对我提供给它的信息什么都不做,我认为这忽略了这些信息。
  • 我不同意你的观点。整体捆绑器不会忽略 ruby​​ 版本,但在处理依赖问题时它不会考虑版本。这是我在回答中提到的。依赖问题清楚地输出到控制台,因此它们应该很容易通过指定版本号来解决。这只是捆绑程序和 gemfile 的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多