如何解决与json gem冲突的bundler gem版本

时间:2016-09-27 22:08:49

标签: ruby-on-rails json ruby bundler

我想在我的应用程序中将json gem更新到2.0.2版。它目前作为版本1.8.3的依赖项加载。

所以,我添加了

gem 'json', '>= 2.0.2'

到我的Gemfile,然后输入

bundle update json

我得到了

Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Bundler could not find compatible versions for gem "json":
In Gemfile:
json (>= 2.0.2)

paperclip (~> 4.2.0) was resolved to 4.2.4, which depends on
  activesupport (>= 3.2.0) was resolved to 4.2.7, which depends on
    json (>= 1.7.7, ~> 1.7)

这对我没有意义,因为我认为 json (>= 1.7.7, ~> 1.7)表示activesupport 4.2.7依赖于至少版本1.7.7 对于json gem,所以2.0.2不应该是冲突,不是吗?

这里的正确解释是什么?

我可以采取哪些步骤以便成功将json v2.0.2 gem添加到我的rails v4.2.7应用程序中?

2 个答案:

答案 0 :(得分:3)

json要求有两个部分。第一个是>= 1.7.7,意味着Gem必须大于或等于1.7.7。事实上,2.0.2大于1.7.7,因此您满足该要求。然而,第二部分是它必须是~> 1.7(发音为“tiddle-wakka”),这就是所谓的悲观约束。它要求版本号的第一个元素匹配,但最后一个元素可以大于或等于给定的数字。因此,例如,1.7.0将满足约束。如1.7.9或1.9.9,甚至1.423.8。但是,2.0.0会使该约束失败,因为主版本号与给定值“1”不匹配。

答案 1 :(得分:0)

~>是所谓的悲观版本约束。点击这里:

http://guides.rubygems.org/patterns/#pessimistic-version-constraint

您可以在那里找到有关复合要求的部分,这基本上就像activesupport为其json要求所做的那样。

长话短说,~>基本上使json版本只匹配json 1.7的次要版本,其中补丁版本为7或更高。

关于是否实现用于覆盖gemspecs中指定的gem版本的bundler选项有一些讨论:https://github.com/bundler/bundler/issues/4552,但是现在,没有这样的选项......

因此,看起来你可能尝试的唯一一件事就是将activesupport升级到activesupport 5或更高版本(他们摆脱了json依赖关系),如果Rails有轻微的话,这很可能会以同样的方式破坏你的依赖关系版本固定为activesupport及其余的gem依赖项。