关于npm:如何在package.json [Node.js]中设置环境变量

How to set Environment variables from within package.json [Node.js]

如何在package.json中设置一些环境变量,以便与npm start类命令一起使用

以下是我目前在我的package.json中的内容:

1
2
3
4
5
6
7
8
{
  ...
 "scripts": {
   "help":"tagove help",
   "start":"tagove start"
  }
  ...
}

在这里,我想在开始脚本中设置环境变量(如NODE_ENV,同时仍然能够只使用一个命令npm start启动应用程序。


在脚本命令中设置环境变量:

1
2
3
4
5
6
...
"scripts": {
 "start":"node app.js",
 "test":"NODE_ENV=test mocha --reporter spec"
},
...

然后在应用程序中使用process.env.NODE_ENV

注意:这仅适用于Mac&Linux。对于Windows,请参阅注释。


只需使用NPM包交叉环境。超级容易。适用于Windows、Linux和所有环境。请注意,您不会使用&;移动到下一个任务。您只需设置env,然后开始下一个任务。感谢@mikekidder在其中一条评论中提出的建议。

来自文档:

1
2
3
4
5
{
 "scripts": {
   "build":"cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}

注意,如果要设置多个全局变量,只需连续地声明它们,然后执行命令。

最后,执行(使用spawn)的命令是:

1
webpack --config build/webpack.config.js

NODE_ENV环境变量将由cross env设置。


我只想在这里为将来的节点探索者添加我的2美分。在我的Ubuntu 14.04中,NODE_ENV=test不起作用,我不得不使用export NODE_ENV=test,之后NODE_ENV=test也开始起作用,很奇怪。

在Windows上,正如前面所说,您必须使用set NODE_ENV=test,但对于跨平台解决方案,cross env库似乎没有做到这一点,您是否真的需要一个库来做到这一点:

1
export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

垂直杆是必需的,否则窗户会撞到无法识别的export NODE_ENV命令:d.dunno关于尾随空格,但只是为了确保我也删除了它们。


突然我发现actionhero使用了以下代码,通过在start-script命令选项中传递--NODE_ENV=production,解决了我的问题。

1
2
3
4
5
if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

我真的很高兴能接受其他人的回答,他们更了解如何在package.json或init脚本中设置环境变量,或者类似于其他人引导应用程序的方法。


在Windows上尝试此操作,方法是替换YOURENV

1
2
3
4
5
6
7
8
  {
    ...
    "scripts": {
      "help":"set NODE_ENV=YOURENV&& tagove help",
      "start":"set NODE_ENV=YOURENV&& tagove start"
     }
    ...
  }


因为我经常发现自己在处理多个环境变量,所以将它们保存在单独的.env文件中(确保从源代码管理中忽略这一点)非常有用。

1
2
VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

然后在您的脚本命令之前预先准备好export $(cat .env | xargs) &&

例子:

1
2
3
4
5
6
7
8
9
10
{
  ...
 "scripts": {
    ...
   "start":"export $(cat .env | xargs) && echo do your thing here",
   "env":"export $(cat .env | xargs) && env",
   "env-windows":"export $(cat .env | xargs) && set"
  }
  ...
}

对于测试,您可以通过运行npm run envnpm run env-windows来查看env变量。


虽然我没有直接回答这个问题,但我想在其他答案的基础上分享一个想法。从我所获得的信息来看,每一个都将提供一定程度的复杂性,以实现跨平台的独立性。

在我的场景中,我最初希望设置一个变量来控制是否使用JWT身份验证来保护服务器(用于开发目的)。

在阅读了答案之后,我决定创建两个不同的文件,分别打开和关闭身份验证。

1
2
3
4
 "scripts": {
   "dev":"nodemon --debug  index_auth.js",
   "devna":"nodemon --debug  index_no_auth.js",
  }

这些文件只是调用原始index.js文件(我将其重命名为appbootstrapper.js)的包装器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

也许这能帮助别人


1
2
3
4
5
6
7
{
  ...
 "scripts": {
   "start":"ENV NODE_ENV=production someapp --options"
  }
  ...
}

不应在package.json中设置env变量。actionHero使用NODE_ENV允许您更改从./config中的文件加载的配置选项。查看redis配置文件,查看node_env如何用于更改NODE_ENV=test中的数据库选项。

如果您想使用其他env变量来设置内容(可能是HTTP端口),您仍然不需要更改package.json中的任何内容。例如,如果在env中设置PORT=1234并希望将其用作NODE_ENV=production中的HTTP端口,只需在相关配置文件中引用它,即:

1
2
3
4
5
6
7
8
9
10
# in config/servers/web.js
exports.production = {
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}


这将在Windows控制台中工作:

1
2
3
4
"scripts": {
 "aaa":"set TMP=test && npm run bbb",
 "bbb":"echo %TMP%"
}

npm run aaa

输出:test

有关详细信息,请参阅此答案。