如何解决Bundler中Gem兼容性问题?

5
在我们的rails应用程序中,我们使用了两个gem(urbanairship和nylas),这些gem需要rest-client。其中一个需要约1.6.7版本,另一个需要约1.7.1版本。
通常的bundle udpate 和rm Gemfile.lock; bundle install操作无法解决问题。
当bundler解析依赖项时,我们会得到以下错误提示:
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies............................................................................................................................................
Bundler could not find compatible versions for gem "rest-client":
  In Gemfile:
    urbanairship (~> 3.0.1) ruby depends on
      unirest (>= 1.1.2, ~> 1.1) ruby depends on
        rest-client (~> 1.6.7) ruby

    nylas (>= 0) ruby depends on
      rest-client (~> 1.7) ruby

很遗憾,我们无法使用不同版本的nylasurbanairship。我们唯一看到的解决方法是分叉其中一个并编辑.gemspec来接受rest-client的相同版本。

有更简单的解决方法吗?


4
你需要fork并放松对版本的要求。不过这些要求通常是由于所需gem中特定的行为而存在的。考虑放宽你对urbanairship的要求到~>1.6,然后运行bundle update和其测试。如果一切顺利,那么我会提交并在Gemfile中使用你的fork,并提出一个pull request。 :) - Chris Heald
3
#18#22中已经有两个拉取请求(Unirest宝石),均放宽了rest-client依赖关系。 不幸的是,它们都还没有合并... - Holger Just
记住,您可以使用git源说明符和哈希选项,部署任意版本的宝石。 各种git选项 可以涵盖许多在此类情况下非常有用的案例。除非需要更改.gemspec文件,否则不需要fork该存储库。 - tadman
1个回答

0
最后,我决定听从Chris的建议。
  1. 分叉了 nylas https://github.com/hartator/nylas-ruby/

  2. 放松了 Gemfile 中对于 rest-client 的要求。 (之前是 1.7)

    gem 'rest-client', '~> 1.6'

  3. 放松了 nylas.gemspec 中对于 rest-client 的要求。 (之前是 1.7)

    s.add_dependency(%q<rest-client>, ["~> 1.6"])

  4. 放松了 nylas.gemspec 中对于 rest-client 的运行时要求。 (之前是 1.7)

    s.add_runtime_dependency(%q<rest-client>, ["~> 1.6"])

  5. 运行了测试,所有都通过了。

  6. 将修改后的 gem 添加到我的应用程序的 Gemfile

    gem 'nylas', git: 'git@github.com:hartator/nylas-ruby.git'

一切都在运作中。仍然想知道是否有更简洁的解决方案。

参考:https://github.com/hartator/nylas-ruby/commit/f7ff4076e96d8a31e223ca0f12d35811d6e9d811


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接