Используйте одновременно 2 версии драгоценных камней
Могу ли я использовать две версии драгоценных камней в одном приложении? Я пытаюсь использовать два плагина rails для совместной работы:
- Pengwynn LinkedIn https://github.com/pengwynn/linkedin для вызовов API LinkedIn, имеет зависимость от oauth (~ > 0.3.5)
- OmniAuth для входа пользователя через несколько известных веб-сайтов, имеет зависимость от oauth 0.4.0
Когда я пытаюсь что-то в rails, я получаю это сообщение об ошибке:
$ rails server
c:/Ruby187/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/resolver.rb:129:in `resolve': Bundler could not find compatible versions for gem "oauth": (Bundler::VersionConflict)
In snapshot (Gemfile.lock):
oauth (0.4.4)
In Gemfile:
linkedin depends on
oauth (~> 0.3.5)
Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
Пробное обновление пакета просто замораживает мой терминал
Возможно ли использовать оба этих плагина одновременно?
Ответы
Ответ 1
Использование двух версий одного драгоценного камня обычно означает: используйте две версии одного и того же класса.
Это невозможно без внесения изменений в эти драгоценные камни. Вы можете попытаться поместить созданные классы в некоторый модуль, разрешить конфликты в методах, импортированных в другие классы, и так далее. В общем, это непростая задача, и обычно эффект не стоит.
Что вы должны делать в таких случаях - попросить сопровождающих gem обновить зависимости или попытаться сделать это самостоятельно.
Возможно, вы можете понизить (использовать более старую версию) один из этих драгоценных камней до версии, в которой зависимости были одинаковыми.
Ответ 2
К сожалению, в Ruby единственный способ исправить (sic!) эти драгоценные камни, поэтому они используют совместимые зависимости
В целом, при создании сложного программного обеспечения в Ruby и в такой ситуации мы, разработчики Ruby, не можем многое сделать. И это действительно плохо, поскольку разработка в Ruby также должна сосредоточиться на этой проблеме.
Вместо того, чтобы предоставлять своим клиентам новые функции или запросы на изменение, нужно жить с Ruby, так называемым: "gem hell".
Еще одна важная характеристика "gem hell" заключается в том, что не всегда лучший выпуск gem - хороший.
- Часто жемчужина не придерживается политики семантического управления версиями и может вводить основные модификации API.
- Часто новая версия gem может вводить новые ошибки в ранее работающие функции.
Другие языки программирования имеют возможность решать эти проблемы. Просто найдите "java несколько версий одного класса", и вы найдете много ресурсов.
Что я могу предложить для приложений меньшего размера:
- быть в курсе всех последних выпусков gems
Что я могу предложить для приложений большего размера, если выше не вариант:
-
Разделите приложение на несколько небольших приложений, сервисов.
Это позволит разделить их, рискуя уменьшить "жемчужину". Если это произойдет, скорее всего, это произойдет не со всеми из них.
Кроме того, различные приложения могут использовать разные версии gem.
-
переключиться на JRuby, где эти проблемы могут быть - теоретически - решены с помощью возможностей Java