Tengo problemas para instalar la gema `eth` en un plugin en producción

Tengo que instalar la gema eth en un plugin, pero me está costando mucho hacerlo. Depende de un montón de otras gemas, algunas de las cuales tienen extensiones nativas. Aquí está la lista de dependencias si quieres intentarlo.

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

El problema es con rbsecp256k1. Intenta requerir mini_portile2 para construir sus extensiones nativas, pero no puede encontrarlo a pesar de que está instalado y se ha hecho require. He recurrido a grandes medidas, como bifurcar la gema y requerir la ruta absoluta manualmente, también he intentado clonar literalmente mini_portile2 en rbsecp256k1 y requerirlo desde allí, pero nada ha funcionado todavía.

Cualquier ayuda sería muy apreciada.

2 Me gusta

Finalmente logré encontrar una solución alternativa. La compartiré en un momento.

3 Me gusta

Aquí está lo que hice. Inicié sesión en el servidor y entré en el contenedor de Docker.

  • crea una carpeta llamada gems

  • crea un subdirectorio 2.7.5 (versión de Ruby utilizada por Discourse en producción en tests-passed)

  • vuelve a la carpeta gems

  • Ejecuta comandos de esta manera

    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: estos son exactamente los mismos comandos que Discourse ejecuta (intenta ejecutar, pero falla) para instalar los gems.

  • Ahora comprime esta carpeta.

  • Sal del contenedor de Docker y copia el zip fuera del contenedor de Docker usando el comando docker cp.

  • Conéctate a tu servidor a través de FileZilla o VSCode y descarga el zip.

  • extráelo en la carpeta raíz de tu plugin. Así, tu carpeta de plugin ahora tendrá el directorio gems.

  • Ahora sube la carpeta gems con el plugin a GitHub.

Ahora, cuando hagas una reconstrucción en Discourse con este plugin, Discourse usará las dependencias que le proporcionaste y no intentará instalarlas. Esta es una solución temporal y deberá rehacerse una vez que Discourse actualice la versión de Ruby.

Pero aquí está la gran pregunta: ¿por qué los mismos comandos que funcionan cuando se ejecutan desde la terminal fallan cuando Discourse intenta ejecutarlos? Realmente valdría la pena investigarlo y espero que haya una solución simple.

3 Me gusta

Arreglé esto recientemente en

3 Me gusta

Genial, gracias. :clap:

¿Podrías seleccionar manualmente este arreglo para stable @tgxworld?

1 me gusta

Hecho en

3 Me gusta