Управление конфликтующими версиями ruby ​​gems

Я создаю фреймворк, который загружает предоставленный пользователем рубиновый код. Это в основном механизм плагинов. Я хочу, чтобы пользователь предоставил рубиновый код, чтобы иметь возможность требовать собственные драгоценные камни. Я намерен включить в пакет «плагин» каталог поставщиков с драгоценными камнями.

Как я могу загрузить драгоценные камни, которые требуются плагину, не конфликтуя с драгоценными камнями моего фреймворка? Например, если мой фреймворк использует версию treetop 1.3.0, а плагин использует версию treetop 1.4.2, я хочу, чтобы каждый из них работал с указанной версией.

Кроме того, есть ли способ предотвратить конфликты плагинов друг с другом?

Я просмотрел gem_plugin, песочницу _why и некоторые другие инструменты. Но я не вижу какой-либо библиотеки, которая специально обрабатывает этот случай - я предполагаю, что это было сделано раньше.

Я также изучил внутренности Bundler, чтобы увидеть, как он управляет версиями гема. Я готов сделать довольно сложные вещи, если потребуется. Но я все еще не уверен, как это сделать.

У меня также есть большая свобода в том, как я это реализую. Так что, если вы думаете, что я лаю не на то дерево, пожалуйста, так и скажите.

Спасибо за любой совет.

ПРИМЕЧАНИЕ. При написании этого мне пришло в голову, что мне нужно что-то похожее на загрузчики классов в контейнере сервлетов Java. Файл WAR может включать в себя jar-файлы, и загрузчик классов веб-приложения предпочтет те jar-файлы, которые находятся в глобальном пути к классам. Есть ли в ruby ​​способ сегментировать рубиновый «путь к классам» (т. е. load_path, require и т. д.)?


person codefinger    schedule 02.01.2011    source источник
comment
Мне пришло в голову, что моя проблема может быть по сути такой же, как эта: ‹stackoverflow.com/questions/4495512/ конфликтующие рубиновые драгоценные камни› Вместо двух разных драгоценных камней — я имею дело с двумя версиями одного и того же драгоценного камня.   -  person codefinger    schedule 02.01.2011


Ответы (2)


Грубо говоря, у вас не может быть одновременно загружено две версии одного и того же драгоценного камня.

Bundler делает хорошую работу, просматривая все необходимые гемы и находя решение для различных перекрывающихся зависимостей, но даже в этом случае он ограничен загрузкой только одной версии гема за раз.

Это приводит к тому, что разработчикам плагинов постоянно приходится обновляться, чтобы поддерживать любые изменения, сделанные в зависимых гемах, чтобы избежать описанной вами ситуации.

(Не рассказывайте мне об ошибках, возникающих из-за различных конкурирующих реализаций JSON, и о боли, через которую вам приходится пройти, когда у вас есть несколько зависимостей gem, для каждой из которых требуются разные.)

person stef    schedule 02.01.2011
comment
Вот чего я боялся. Знаете ли вы какие-либо ссылки на документацию ruby, описывающую это? - person codefinger; 03.01.2011
comment
Вы можете прочитать эту статью, которая проведет вас через несколько именованных сред, которые могут позволить вам сделать что-то с несколькими версиями одного и того же гема. yehudakatz.com/2010/04/21/named-gem -environments-and-bundler Однако в вашем примере я бы либо перекодировал ваше приложение, чтобы использовать ту же версию драгоценного камня, что и плагин, либо разветвил бы плагин для поддержки последней версии драгоценного камня и обновил ваше приложение до такой же. - person stef; 03.01.2011

С уважением не согласен с ответом выше. Вот как я это делаю:

ruby -S gem list my_gem

`*** LOCAL GEMS ***
my_gem (1.0.1, 1.0.0, 0.0.2)
`

ruby -S gem lock my_gem-1.0.0 > locklist.rb

который генерирует список зависимостей для конкретной версии в список блокировки

require 'rubygems'
gem 'my_gem', '= 1.0.0'
gem 'gem_base', '= 1.0.0'
gem 'rest-client', '= 1.7.2'
gem 'savon', '= 1.1.0'
gem 'addressable', '= 2.3.6'
gem 'mime-types', '= 1.25.1'
gem 'netrc', '= 0.11.0'

теперь вы можете сделать load('locklist.rb'), который загрузит определенную версию драгоценного камня вместе с его зависимостями. Смотри, мама, никакого Бандлера.

person bioffe    schedule 18.05.2016