上下文
我们有一个包装系统(yum),用于在我们的生产系统上安装两个包(puppet和facter)。它安装了facter 2.4.3作为木偶3.1.1的依赖(根据yum / RPM)。
生产puppet / facter包没有任何问题,但我一直难以说服Bundler在测试环境中安装该特定版本组合。
根据puppet-3.1.1
gem ,不允许大于2的facter版本作为依赖项,这与puppet-3.1.1
rpm <所需的后续版本相矛盾/ em>的。此外,某些测试/木偶行为在捆绑/测试环境中使用puppet gem“想要”的facter版本失败。
TL; DR:一个gem(puppet)有一个Gemfile依赖项,在我们的测试用例中不起作用,并且在生产中被明确违反,我需要说服Bundler安装两个理论冲突的宝石。
问题:
我尝试了Bundler文档中针对gem问题的建议解决方案:分析有问题的宝石并自行解决问题。这就是它开始变得怪异的地方。
如果我将Bundler指向puppet-3.1.1 gem的 prstine 副本,Bundler将安装我想要的任何版本的依赖(facter)。但是,如果我将Bundler指向Internet上相同的gem版本,则依赖项解析将失败。
鉴于此Gemfile:
source "https://rubygems.org"
gem 'puppet', '3.1.1'
gem 'facter', '2.4.3'
bundle install
失败了:
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Bundler could not find compatible versions for gem "facter":
In Gemfile:
puppet (= 3.1.1) ruby depends on
facter (~> 1.6) ruby
facter (2.4.3)
但是,如果我gem fetch puppet -v 3.1.1
和gem unpack [download location]
(没有对gem内容进行任何修改),并更新Gemfile以说明
source "https://rubygems.org"
gem 'puppet', '3.1.1', :path => "./download_location"
gem 'facter', '2.4.3'
......一切正常。
问题:
我很好维护有问题的gem的本地副本,但我想知道:为什么Bundler会认为依赖于未修改的gem的本地副本,当这些依赖项失败时,如果它从互联网上使用相同的宝石?
作为后续/额外的帮助,如果有人有关于如何更有效地管理这样的问题的想法(OS包管理器和Bundler对gem依赖版本有相互排斥的分歧),而无需维护数千个文件在当地的叉子里,我很乐意听到它们。