为什么 Bundler 拒绝接受没有指定版本的 gem?

Why does Bundler refuse to accept a gem with no version specified?

命令:

bundle update

错误:

Bundler could not find compatible versions for gem "fog-core":
  In Gemfile:
    fog was resolved to 2.0.0, which depends on
      fog-google (<= 0.1.0) was resolved to 0.1.0, which depends on
        fog-core

    fog was resolved to 2.0.0, which depends on
      fog-internet-archive was resolved to 0.0.1, which depends on
        fog-core (~> 1.45)

Bundler 不断发现未指定版本的 fog-corefog-core (~> 1.45) 不兼容。我会认为 .gemspec 文件中没有版本意味着任何版本都可以接受,但事实并非如此。

在尝试升级 fog-aws 的版本后,在一个非常大的项目上,Bundler 1.16.1 版会发生这种情况。

到目前为止,我的解决方案是分叉每个依赖项,进行以下更改:

--- a/foo.gemspec
+++ b/foo.gemspec

-  spec.add_dependency "fog-core"
+  spec.add_dependency "fog-core", "~> 1.45"

...但这是一件愚蠢的事情。必须有更好的方法。

经过一天半的single-stepping通过Bundler,我得到了答案:

如果同时发生以下两种情况:

  1. Bundler 在找到正确版本之前会先查看包的冲突版本(例如 librato-metrics)。
  2. 在 #1 之前或之后发生了任何类型的错误。

...Bundler 将显示已解决的冲突错误以及所有其他错误,即使冲突实际上已经解决并且不需要解决。