2016-05-10 27 views
19

Ho un package.json con i seguenti contenuti (semplificato) negli script chiave:variabili d'ambiente passando NPM-script

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

Dalla riga di comando posso correre:

npm start 

Questo eseguirà il mio script start-app.js e imposteremo la variabile di ambiente process.env.NODE_ENV su "produzione". Vedere here per la spiegazione della sintassi.

Il poststart verrà eseguito automaticamente dopo l'avvio come descritto in here.

Tuttavia poststart non "erediterà" la variabile di ambiente della shell NODE_ENV, quindi il comando echo non eseguirà alcun eco.

Il mio codice di produzione è un po 'più complesso, ma quello che sto cercando di ottenere è passare la variabile NODE_ENV dal "punto di partenza" agli script dipendenti. Qualche suggerimento/miglior pratica su come farlo?

Non voglio hardcode il NODE_ENV nel poststart, perché potrei voler fare:

NODE_ENV=development npm start 

e voglio everyting "valle della catena" ereditano lo stesso ambiente.

+0

Da [quello che vedo] (https://docs.npmjs.com/misc/scripts), campi _he package.json sono attaccato al prefisso npm_package_, quindi si potrebbe voler dire 'npm_package_node_env'. – fedorqui

+0

Quando si eseguono più comandi, è necessario "esportare" la variabile. 'export NODE_ENV = something' – Michael

risposta

13

avete alcune opzioni:

  • better-npm-run, che possono definire un env per ogni comando separatamente
  • Invece di uno script poststart, è possibile concatenare i comandi per NPM in questo modo: "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
  • Usa un gestore di processi in produzione come pm2. pm2 consente di definire i file json specifici per l'ambiente con impostazioni come NODE_ENV. Nella nostra azienda, abbiamo eseguito con successo tutte le nostre applicazioni in ambienti diversi con PM2 (per tutto il tempo che hanno lo stesso comando di avvio)
+0

Il NODE_ENV è ancora disponibile quando fai eco? Ho sperimentato che è andato, ref https://www.npmjs.com/package/cross-env#known-limitations – vonGohren

+0

corretto, con 'cross-env' questo non è possibile. Il secondo esempio in realtà assegna una variabile d'ambiente (non usando cross-env). –

+0

@MarioTacke Ho appena dato questo test e questo ** non assegna ** una variabile. Se è impostato in precedenza sul comando 'npm start', funziona (all'interno di un comando di script' start'). – kaiser

0

Se si dispone di piccola uso carter, utilizzare meglio-NPM-run. Per i casi piccoli, funziona bene. In qualche modo, se hai molti comandi, è difficile da gestire. Prova, batman-cli. Lavorare bene e gestire molte questioni ambientali-dipendente

NPM i -G batman-cli

Problemi correlati