Ejecute "npm" desde la aplicación Laravel en Laravel Forge-Setup

Nov 08 2020

Desarrollé una herramienta que genera un archivo scss, ejecuta npm run prod y carga el archivo app.css generado en un servidor.

A nivel local, esto no fue un problema. Simplemente corrí shell_exec('npm run production')y funcionó con éxito.

Ahora, hoy, implementé la herramienta en un DigitalOcean-Server administrado por Laravel Forge. Ahora, la ejecución del comando NPM ya no funciona. En su lugar, veo este error al ejecutar npm run production:

ERR! file sh
npm ERR! path sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm 

Cuando ahora cambio el script a npm -vveo esto:

6.9.0

Alguien sabe, ¿cómo hacer que NPM funcione aquí?

(producción es un alias de este comando: cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js)

Actualizar:

Ahora, traté de usar hilo. Correr yarn installfuncionó bien. Se esperaba el resultado. Pero al ejecutar el desarrollo de ejecución de hilo, se produce este siguiente error:

2020-11-07 20:03:55 STDOUT: yarn run v1.17.3
2020-11-07 20:03:55 STDOUT: $ npm run development
2020-11-07 20:03:55 STDERR: /bin/sh: 1: 
2020-11-07 20:03:55 STDERR: npm: not found
2020-11-07 20:03:55 STDERR: error Command failed with exit code 127.
2020-11-07 20:03:55 STDOUT: info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Si ejecuto el desarrollo de ejecución de hilo manualmente a través de ssh en el mismo directorio exacto, todo funciona bien.

Actualización 2: pensé, tal vez el problema es que Laravel es ejecutado por otro usuario en SSH. Pero ambos son la fragua del usuario .

Respuestas

3 Dan Nov 12 2020 at 19:45

Encontré dos posibles soluciones para eso.

Uno de ellos en una pregunta sobre shell_execy npmde hace unos años con la solución que $PATHno incluye /bincuando se llama como un script npm por lo que no encuentra /bin/shper error file sh(no mis palabras, vea la pregunta original ). Su solución fue un enlace simbólico /bin/sha /usr/bin/sh:

ln -s /bin/sh /usr/bin/sh

La otra solución podría ser utilizando Symony Process:

use Symfony\Component\Process\Process;

(new Process(['npm', 'run', 'production'], base_path()))
    ->setTimeout(null)
    ->run(function ($type, $output) { $this->output->write($output);
    });

Ambas soluciones no se prueban ya que actualmente no tengo acceso a un servidor de DigitalOcean ni a una cuenta de Laravel Forge.