Difficulté à installer la gemme `eth` dans un plugin en production

Je dois installer la gemme eth dans un plugin, mais j’ai beaucoup de mal à le faire. Elle dépend d’un tas d’autres gemmes, dont certaines ont des extensions natives. Voici la liste des dépendances si vous voulez essayer.

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

Le problème vient de rbsecp256k1. Il essaie de requerir mini_portile2 pour construire ses extensions natives mais ne le trouve pas, même s’il est installé et required. J’ai fait de grands efforts, comme forker la gemme et requerir le chemin absolu manuellement, j’ai aussi essayé de cloner littéralement mini_portile2 dans rbsecp256k1 et de le requerir à partir de là, mais rien n’a fonctionné jusqu’à présent.

Toute aide serait grandement appréciée.

2 « J'aime »

J’ai finalement réussi à trouver une solution de contournement. Je la partagerai dans un instant.

3 « J'aime »

Voici ce que j’ai fait. Je me suis connecté au serveur et suis entré dans le conteneur Docker.

  • Créez un dossier nommé gems

  • Créez un sous-répertoire 2.7.5 (version Ruby utilisée par le Discourse de production sur tests-passed)

  • Revenez au dossier gems

  • Exécutez les commandes de cette manière

    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
    ...
    

    Remarque : ce sont exactement les mêmes commandes que Discourse exécute (tente d’exécuter, mais échoue) pour installer les gems.

  • Compressez maintenant ce dossier.

  • Quittez le conteneur Docker et copiez le fichier zip à l’extérieur du conteneur Docker à l’aide de la commande docker cp.

  • Connectez-vous à votre serveur via FileZilla ou VSCode et téléchargez le fichier zip.

  • Extrayez-le dans le dossier racine de votre plugin. Votre dossier de plugin contiendra donc maintenant le répertoire gems.

  • Poussez maintenant le dossier gems avec le plugin sur GitHub.

Maintenant, lorsque vous reconstruirez Discourse avec ce plugin, Discourse utilisera les dépendances que vous lui avez fournies et n’essaiera pas de les installer. Il s’agit d’une solution de contournement temporaire qui devra être refaite une fois que Discourse aura mis à jour la version Ruby.

Mais voici la grande question : pourquoi les mêmes commandes qui fonctionnent lorsqu’elles sont exécutées depuis le terminal échouent-elles lorsque Discourse essaie de les exécuter ? Cela vaut vraiment la peine d’y regarder et j’espère qu’il existe une solution simple.

3 « J'aime »

J’ai récemment corrigé cela dans

3 « J'aime »

Génial, merci. :clap:

Pourriez-vous sélectionner cette correction pour stable @tgxworld ?

1 « J'aime »

Fait dans \n\nDEV: Don't load bundler when installing plugin gem. by tgxworld · Pull Request #16176 · discourse/discourse · GitHub

3 « J'aime »