with start scripts script run node globales entorno node.js shell npm environment-variables

node.js - start - Pasando variables de entorno en npm-scripts



variables en node js (2)

Tengo un package.json con el siguiente contenido (simplificado) en la clave de scripts:

... scripts: { "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js", "poststart": "echo $NODE_ENV" } ...

Desde la línea de comandos puedo ejecutar:

npm start

Esto ejecutará mi script start-app.js y establecerá la variable de entorno process.env.NODE_ENV en "producción". Vea here para la explicación de la sintaxis.

El poststart se ejecutará automáticamente después del inicio como se describe here .

Sin embargo, poststart no "heredará" la variable de entorno de shell NODE_ENV, por lo que el comando echo no hará eco de nada.

Mi código de producción es un poco más complejo, pero lo que estoy tratando de lograr es pasar la variable NODE_ENV desde el "punto de partida" a los scripts dependientes. ¿Alguna sugerencia / mejores prácticas sobre cómo hacer eso?

No quiero codificar el NODE_ENV en el poststart, porque podría querer hacerlo:

NODE_ENV=development npm start

y quiero que todo "en la cadena" herede el mismo entorno.


Si tiene un uso pequeño, utilice mejor-npm-run. Para casos pequeños, funciona bien. De alguna manera si tienes muchos comandos y es difícil de manejar. Intenta, batman-cli . Trabaja bien y maneja muchos problemas que dependen del ambiente.

npm i -g batman-cli


Tienes pocas opciones:

  • better-npm-run , que puede definir un env para cada comando por separado
  • En lugar de una poststart comandos poststart al poststart , puede concatenar comandos para npm así: "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
  • Use un administrador de procesos en producción como pm2 . pm2 le permite definir archivos json específicos del entorno con configuraciones como NODE_ENV . En nuestra empresa, ejecutamos con éxito todas nuestras aplicaciones en diferentes entornos con pm2 (al mismo tiempo que tenemos el mismo comando de inicio)