我正在使用一个刀插件,并且遇到了我的宝石与另一个已经安装的宝石之间的依赖冲突:
$ gem list fog
fog (1.24.0, 1.20.0, 1.11.1)
我安装了knife-ec2
,这取决于雾1.20.0。我正在研究的宝石依赖于雾1.23.0。它根本不依赖于刀-ec2。
当我运行我的刀插件时,我收到错误:
$ knife myplugin
`raise_if_conflicts': Unable to activate knife-ec2-0.8.0, because fog-1.24.0 conflicts with fog (~> 1.20.0) (Gem::LoadError)
如果我卸载了刀-ec2,我的刀插件会毫无问题地运行。
当我运行自己的插件时,我不明白为什么ec2 gem正在加载。刀装载所有插件吗?有没有办法解决具有相同依赖关系的不同版本的2个插件?
答案 0 :(得分:1)
看起来刀在运行时确实加载了它的所有插件。如果2个不同的插件依赖于不同版本的gem,这会带来一些问题。
我无法为系统安装的刀插件宝石找到解决此问题的明确方法,但有一个解决方法。它不是最优雅的解决方案,但它适用于我,也适合你。它是基于Bundler的解决方法:
bundle install --path vendor/bundle
在本地安装依赖项(如果使用bundle install --deployment
选项,我使用的是Bundler将安装的相同路径,并生成Gemfile.lock(假设您具有一致的路径)你当地的宝石)。bundle exec knife myplugin -h
- 成功我有许多插件集需要一起工作,因此我可以在不同的环境中使用Gemfiles的几个目录:来自每个目录的bundler,每个目录配置不同的插件集。
示例Gemfile:
source 'https://rubygems.org'
gem "fog", "~> 1.24"
gem "knife-myplugin", :path => "/path/to/myplugin"