es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aplicación de Nodejs en Heroku “error al cargar bibliotecas compartidas: libffi.so.6: no se puede abrir el archivo de objeto compartido: No existe el archivo o el directorio”.

Tengo un archivo ejecutable llamado “Main” que quiero ejecutar en una aplicación de nodo en heroku. Para hacerlo, uso esta función:

function run(code, params) {
  const { execFileSync } = require('child_process');
  const child = execFileSync('/app/Main', params ? [code, params] : [code], {
    timeout: timeout * 1000,
    cwd: __dirname,
    stdio: 'pipe',
  })
  if (child.status === null) {
    return `child status null`
  }
  return child.stdout.toString()
}

Pero me devuelve este error:

./Main: error while loading shared libraries: libffi.so.6: cannot open shared object file: No such file or directory

También recibo este error cuando ejecuto:

heroku run bash -a "appname"

y luego intento ejecutar

./Main

¿Hay alguna forma de solucionar esto? Según mi experiencia, el sistema de archivos de heroku está muy restringido y casi siempre tiene acceso solo de lectura. ¿Puedo descargar una versión anterior del archivo con curl a su ubicación correcta utilizando un archivo .profile o algo similar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el archivo ejecutable “Main” no tiene una biblioteca compartida llamada “libffi.so.6”. Esta biblioteca compartida no está presente en el sistema de archivos de Heroku, que es de solo lectura y no se puede modificar.

    Una forma de solucionarlo es instalar la biblioteca faltante en un directorio local, incluirla en el paquete que se empuja a Heroku y luego utilizar la variable de entorno LD_LIBRARY_PATH para ubicarla en el tiempo de ejecución. Aquí están los pasos a seguir:

    1. Instale la biblioteca faltante en un directorio local:
    wget http://archive.ubuntu.com/ubuntu/pool/main/libf/libffi/libffi6_3.2.1-8_amd64.deb
    dpkg -x libffi6_3.2.1-8_amd64.deb libffi
    
    1. Copie la biblioteca en el directorio de su proyecto y agregue el archivo a .gitignore:
    cp libffi/lib/x86_64-linux-gnu/libffi.so.6 myproject/libffi.so.6
    echo "libffi.so.6" >> .gitignore
    
    1. Edite su archivo package.json para incluir la biblioteca en el paquete:
    "scripts": {
      "postinstall": "cp libffi.so.6 node_modules/ffi-napi/build/Release/ffi_bindings.node"
    },
    "dependencies": {
      "ffi-napi": "^3.0.1"
    }
    

    Esto asume que la biblioteca faltante es necesaria para el paquete ffi-napi, que es un caso de uso común para necesitar libffi.so.6.

    1. Use la variable de entorno LD_LIBRARY_PATH en su código para ubicar la biblioteca en el tiempo de ejecución:
    function run(code, params) {
      const { execFileSync } = require('child_process');
      const child = execFileSync('/app/Main', params ? [code, params] : [code], {
        timeout: timeout * 1000,
        cwd: __dirname,
        stdio: 'pipe',
        env: { LD_LIBRARY_PATH: './myproject' }
      })
      if (child.status === null) {
        return `child status null`
      }
      return child.stdout.toString()
    }
    

    En este ejemplo, la variable de entorno LD_LIBRARY_PATH se establece en el directorio local donde se copió la biblioteca. Esto le dice al sistema dónde buscar la biblioteca al ejecutar el archivo ejecutable.

    Siguiendo estos pasos, debería poder solucionar el error de biblioteca faltante y ejecutar su archivo ejecutable en Heroku.

Comments are closed.