如何解决捆绑器 gem 版本与 json gem 的冲突
How to resolve bundler gem version conflict with json gem
我想在我的应用程序中将 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的jsongem,所以2.0.2应该不会冲突吧?
这里正确的解释是什么?
我可以采取什么步骤才能成功将 json v2.0.2 gem 添加到我的 rails v4.2.7 应用程序?
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”不匹配。
~>
就是所谓的悲观版本约束。在这里查看:
http://guides.rubygems.org/patterns/#pessimistic-version-constraint
您会在那里找到关于复合要求的部分,这基本上就是 activesupport 为其 json 要求所做的工作。
长话短说,~>
基本上使 json 版本仅匹配 json 1.7
的次要版本,其中补丁版本为 7 或更高。
有一些关于是否实施捆绑器选项以覆盖 gem 规范中指定的 gem 版本的讨论:https://github.com/bundler/bundler/issues/4552,但目前还没有这样的讨论选项...
所以,看起来您唯一可以尝试的就是将 activesupport 升级到 activesupport 5 或更高版本(他们摆脱了 json 依赖),这很可能会破坏您的依赖如果 Rails 具有针对 activesupport 及其其余 gem 依赖项的次要版本固定,则采用相同的方式。
我想在我的应用程序中将 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的jsongem,所以2.0.2应该不会冲突吧?
这里正确的解释是什么?
我可以采取什么步骤才能成功将 json v2.0.2 gem 添加到我的 rails v4.2.7 应用程序?
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”不匹配。
~>
就是所谓的悲观版本约束。在这里查看:
http://guides.rubygems.org/patterns/#pessimistic-version-constraint
您会在那里找到关于复合要求的部分,这基本上就是 activesupport 为其 json 要求所做的工作。
长话短说,~>
基本上使 json 版本仅匹配 json 1.7
的次要版本,其中补丁版本为 7 或更高。
有一些关于是否实施捆绑器选项以覆盖 gem 规范中指定的 gem 版本的讨论:https://github.com/bundler/bundler/issues/4552,但目前还没有这样的讨论选项...
所以,看起来您唯一可以尝试的就是将 activesupport 升级到 activesupport 5 或更高版本(他们摆脱了 json 依赖),这很可能会破坏您的依赖如果 Rails 具有针对 activesupport 及其其余 gem 依赖项的次要版本固定,则采用相同的方式。