Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing environment variables in npm-scripts

I have a package.json with following (simplified) content in the scripts key:

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

From the command line I can run:

npm start 

This will run my start-app.js script and set the process.env.NODE_ENV environment variable to "production". See here for syntax explanation.

The poststart will automatically run after start as described here.

However poststart will not "inherit" the NODE_ENV shell environment variable, so the echo command will not echo anything.

My producation code is a little more complex, but what I am trying to accomplish is passing down the NODE_ENV variable from the "starting point" to dependent scripts. Any suggestions/best practices on how to do that?

I dont want to hardcode the NODE_ENV in the poststart, because I might want to do:

NODE_ENV=development npm start 

and I want everyting "down the chain" inherit the same environment.

like image 880
Hans Avatar asked May 10 '16 14:05

Hans


People also ask

How do I get environment variables in package json?

For a test you can see the env variables by running npm run env-linux or npm run env-windows , and test that they make it into your app by running npm run start-linux or npm run start-windows .

How do I add variables to npm?

"Edit the System environment variables" option will be popped in the result. Open that, select the "Path" and click on edit, then click "New" add your nodeJS Bin path i.e in my machine its installed in c:\programfiles\nodejs\node_modules\npm\bin. Once you added click "Ok" then close.


1 Answers

You have a few options:

  • better-npm-run,which can define an env for each command separately
  • Instead of a poststart script, you can concatenate commands for npm like so: "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
  • Use a process manager in production like pm2. pm2 lets you define environment specific json files with settings such as NODE_ENV. At our company, we successfully run all of our apps in different environments with pm2 (all the while having the same start command)
like image 162
Mario Tacke Avatar answered Sep 20 '22 14:09

Mario Tacke