Трудности с установкой gem `eth` в плагине в production

Мне приходится устанавливать гем eth в плагине, но у меня возникают серьёзные трудности. Он зависит от множества других гемов, некоторые из которых содержат нативные расширения. Вот список зависимостей, если захотите попробовать:

gem 'pkg-config', '1.4.7', require: false
gem 'mkmfmf', '0.4', require: false
gem 'keccak', '1.3.0', require: false
gem 'zip', '2.0.2', require: false
gem 'mini_portile2', '2.7.0', require: false
gem 'rbsecp256k1', '5.1.0', require: false
gem 'konstructor', '1.0.2', require: false
gem 'ffi', '1.15.5', require: false
gem 'ffi-compiler', '1.0.1', require: false
gem 'scrypt', '3.0.7', require: false
gem 'eth', '0.5.1', require: false
gem 'siwe', '1.0.0', require: false

Проблема заключается в геме rbsecp256k1. Он пытается подключить mini_portile2 для сборки своих нативных расширений, но не может его найти, несмотря на то что он установлен и подключён через require. Я предпринял множество попыток: например, форкнул гем и вручную указал абсолютный путь, также пробовал буквально клонировать mini_portile2 внутрь rbsecp256k1 и подключать его оттуда, но пока ничего не помогло.

Буду очень признателен за любую помощь.

Наконец-то мне удалось найти обходное решение. Поделясь им через минуту.

Вот что я сделал. Я вошел на сервер и зашел в контейнер Docker.

  • Создал папку с именем gems

  • Создал подкаталог 2.7.5 (версия Ruby, используемая в продакшн-окружении Discourse на ветке tests-passed)

  • Вернулся в папку gems

  • Запустил команды следующим образом:

    RUBY_VERSION=2.7.5
    gem install pkg-config -v 1.4.7 -i $RUBY_VERSION --no-document --ignore- 
    dependencies --no-user-install
    gem install mkmfmf -v 0.4 -i $RUBY_VERSION --no-document --ignore-dependencies 
    --no-user-install
    ...
    

    Примечание: это те же самые команды, которые запускает (пытается запустить, но терпит неудачу) Discourse для установки гемов.

  • Теперь заархивируйте эту папку.

  • Выйдите из контейнера Docker и скопируйте архив за его пределы, используя команду docker cp.

  • Подключитесь к вашему серверу через FileZilla или VSCode и скачайте архив.

  • Распакуйте его в корневую папку вашего плагина. Теперь в папке плагина будет присутствовать каталог gems.

  • Теперь отправьте папку gems вместе с плагином в GitHub.

Теперь, когда вы выполните пересборку в Discourse с этим плагином, система будет использовать предоставленные вами зависимости и не будет пытаться их установить. Это временное решение, и его придется повторять заново, как только Discourse обновит версию Ruby.

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

Я недавно исправил это в

Отлично, спасибо. :clap:

Сможешь применить этот исправление к ветке stable @tgxworld?

Сделано в