Конфликтующие драгоценные зависимости (плагин ножа)
Я работаю над плагином ножа и сталкиваюсь с конфликтом зависимостей между моим гемом и другим, который установлен:
$ 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 загружается, когда я запускаю свой собственный плагин. Нож загружает все плагины? Есть ли способ решить 2 ножевых плагина, которые имеют разные версии одной и той же зависимости?
1 ответ
Кажется, нож действительно загружает все свои плагины во время работы. Это создает небольшую проблему, если 2 разных плагина зависят от разных версий гема.
Я не вижу четкого способа решения этой проблемы для установленных на компьютере самоцветов плагинов ножей, но есть обходной путь. Это не самое элегантное решение, но оно работает для меня и, возможно, для вас. Это обходной путь на основе Bundler:
- Создайте каталог для работы.
- Создайте Gemfile с неконфликтующими зависимостями. Пример моего файла gem показан ниже.
- Установите зависимости локально, используя bundler:
bundle install --path vendor/bundle
(Я использую тот же путь, к которому установил бы упаковщик, еслиbundle install --deployment
и генерирует Gemfile.lock (учитывая, что у вас есть постоянный путь к вашим локальным гемам). - Выполнить нож через связку:
bundle exec knife myplugin -h
- успех
У меня есть несколько наборов плагинов, которые мне нужны для совместной работы, поэтому у меня есть несколько каталогов с Gemfiles, которые я могу использовать в разных средах: из комплектов от каждого из каталогов, каждый из которых настроен на разные наборы плагинов.
Образец Gemfile:
source 'https://rubygems.org'
gem "fog", "~> 1.24"
gem "knife-myplugin", :path => "/path/to/myplugin"