2016-09-27 106 views
2

我想在我的应用中将json gem更新到2.0.2版。它目前作为1.8.3版本的依赖项加载。如何解决与json gem的bundler gem版本冲突

所以,我说

gem 'json', '>= 2.0.2' 

我的Gemfile和I型

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)是说主动支持4.2.7是依赖t对至少是1.7.7的json宝石,所以2.0.2不应该是冲突,不是?

这里的正确解释是什么?

我可以采取哪些措施,以便我可以将json v2.0.2 gem添加到我的rails v4.2.7应用程序中?

回答

2

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”不匹配。

+0

感谢您的解释,现在冲突消息是有道理的。所以这是说永远不可能在rails v4.2.7上使用json v2.0.2? – Streamline

0

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

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

你会发现一个节还有复方要求,这基本上是什么样子的ActiveSupport正在为它的json的要求。

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

有关于是否要实施覆盖在gemspecs这里指定的宝石版本捆绑选择一些讨论:https://github.com/bundler/bundler/issues/4552,但现在,有没有这样的选项...

所以,它看起来像只有你可能会尝试的是将activesupport升级到activesupport 5或更高版本(他们摆脱了json依赖),如果Rails对主动支持有较小的版本固定并且其余的可以很好地以相同的方式打破你的依赖关系宝石依赖。