2016-09-27 110 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對主動支持有較小的版本固定並且其餘的可以很好地以相同的方式打破你的依賴關係寶石依賴。