Я создаю фреймворк, который загружает предоставленный пользователем рубиновый код. Это в основном механизм плагинов. Я хочу, чтобы пользователь предоставил рубиновый код, чтобы иметь возможность требовать собственные драгоценные камни. Я намерен включить в пакет «плагин» каталог поставщиков с драгоценными камнями.
Как я могу загрузить драгоценные камни, которые требуются плагину, не конфликтуя с драгоценными камнями моего фреймворка? Например, если мой фреймворк использует версию treetop 1.3.0, а плагин использует версию treetop 1.4.2, я хочу, чтобы каждый из них работал с указанной версией.
Кроме того, есть ли способ предотвратить конфликты плагинов друг с другом?
Я просмотрел gem_plugin, песочницу _why и некоторые другие инструменты. Но я не вижу какой-либо библиотеки, которая специально обрабатывает этот случай - я предполагаю, что это было сделано раньше.
Я также изучил внутренности Bundler, чтобы увидеть, как он управляет версиями гема. Я готов сделать довольно сложные вещи, если потребуется. Но я все еще не уверен, как это сделать.
У меня также есть большая свобода в том, как я это реализую. Так что, если вы думаете, что я лаю не на то дерево, пожалуйста, так и скажите.
Спасибо за любой совет.
ПРИМЕЧАНИЕ. При написании этого мне пришло в голову, что мне нужно что-то похожее на загрузчики классов в контейнере сервлетов Java. Файл WAR может включать в себя jar-файлы, и загрузчик классов веб-приложения предпочтет те jar-файлы, которые находятся в глобальном пути к классам. Есть ли в ruby способ сегментировать рубиновый «путь к классам» (т. е. load_path, require и т. д.)?