Tendo dificuldade em instalar a gem `eth` em um plugin em produção

Estou tendo que instalar a gem eth em um plugin, mas estou tendo muita dificuldade em fazer isso. Ela depende de várias outras gems, algumas das quais têm extensões nativas. Aqui está a lista de dependências, caso queira tentar.

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

O problema é com rbsecp256k1. Ele tenta requisitar mini_portile2 para construir suas extensões nativas, mas não consegue encontrá-la, apesar de estar instalada e ser requisitada. Eu já fiz de tudo, como fazer um fork da gem e requisitar o caminho absoluto manualmente, também tentei literalmente clonar mini_portile2 para dentro de rbsecp256k1 e requisitá-la de lá, mas nada funcionou ainda.

Qualquer ajuda seria muito apreciada.

2 curtidas

Finalmente consegui encontrar uma solução alternativa. Compartilharei em breve.

3 curtidas

Aqui está o que fiz. Fiz login no servidor e entrei no contêiner docker.

  • crie uma pasta chamada gems

  • crie um subdiretório 2.7.5 (versão ruby usada pelo discourse de produção em tests-passed)

  • volte para a pasta gems

  • Execute os comandos desta forma

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

    Nota: estes são exatamente os mesmos comandos que o discourse executa (tenta executar, mas falha) para instalar os gems.

  • Agora comprima esta pasta.

  • Saia do contêiner docker e copie o zip para fora do contêiner docker usando o comando docker cp.

  • Conecte-se ao seu servidor via filezilla ou vscode e baixe o zip.

  • Extraia-o para a pasta raiz do seu plugin. Assim, sua pasta de plugin agora terá o diretório gems.

  • Agora envie a pasta gems com o plugin para o github.

Agora, quando você fizer um rebuild no discourse com este plugin, o discourse usará as dependências que você forneceu e não tentará instalá-las. Esta é uma solução temporária e precisará ser refeita assim que o discourse atualizar a versão do ruby.

Mas aqui está a grande questão: por que os mesmos comandos que funcionam ao serem executados pelo terminal falham quando o discourse tenta executá-los? Vale muito a pena investigar e espero que haja uma solução simples.

3 curtidas

Eu corrigi isso recentemente em

3 curtidas

Incrível, obrigado. :clap:

Você seria capaz de selecionar manualmente este conserto para stable @tgxworld?

1 curtida

Feito em

3 curtidas