冲突的gem依赖项(刀插件)

时间:2014-11-11 20:13:41

标签: rubygems dependency-management knife

我正在使用一个刀插件,并且遇到了我的宝石与另一个已经安装的宝石之间的依赖冲突:

$ 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个插件?

1 个答案:

答案 0 :(得分:1)

看起来刀在运行时确实加载了它的所有插件。如果2个不同的插件依赖于不同版本的gem,这会带来一些问题。

我无法为系统安装的刀插件宝石找到解决此问题的明确方法,但有一个解决方法。它不是最优雅的解决方案,但它适用于我,也适合你。它是基于Bundler的解决方法:

  1. 创建一个可以使用的目录。
  2. 创建一个具有非冲突依赖关系的Gemfile。我的gem文件示例如下所示。
  3. 使用bundler bundle install --path vendor/bundle在本地安装依赖项(如果使用bundle install --deployment选项,我使用的是Bundler将安装的相同路径,并生成Gemfile.lock(假设您具有一致的路径)你当地的宝石)。
  4. 通过捆绑器执行刀具:bundle exec knife myplugin -h - 成功
  5. 我有许多插件集需要一起工作,因此我可以在不同的环境中使用Gemfiles的几个目录:来自每个目录的bundler,每个目录配置不同的插件集。

    示例Gemfile:

    source 'https://rubygems.org'
    gem "fog", "~> 1.24"
    gem "knife-myplugin", :path => "/path/to/myplugin"