在npm-scripts中传递环境变量

时间:2016-05-10 14:01:23

标签: node.js shell npm environment-variables

我有一个package.json,脚本密钥中包含以下(简化)内容:

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

从命令行我可以运行:

npm start

这将运行我的start-app.js脚本并将process.env.NODE_ENV环境变量设置为“production”。有关语法说明,请参阅here

poststart将在开始后自动运行,如here所述。

但是,poststart不会“继承”NODE_ENV shell环境变量,因此echo命令不会回显任何内容。

我的生产代码有点复杂,但我想要完成的是将NODE_ENV变量从“起点”传递给依赖脚本。关于如何做的任何建议/最佳实践?

我不想在poststart中对NODE_ENV进行硬编码,因为我可能想这样做:

NODE_ENV=development npm start

我希望每一个“沿着链子”继承相同的环境。

3 个答案:

答案 0 :(得分:15)

您有几个选择:

  • better-npm-run,可以单独为每个命令定义env
  • 您可以为npm连接命令,而不是poststart脚本,如下所示:"start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
  • 在生产中使用流程管理器,例如pm2。 pm2允许您使用NODE_ENV等设置定义特定于环境的json文件。在我们公司,我们使用pm2成功运行我们在不同环境中的所有应用程序(同时具有相同的启动命令)

答案 1 :(得分:1)

这是我的方法,首先您需要安装两个开发依赖项

https://www.npmjs.com/package/env-cmd 这将从文件中加载环境变量

https://www.npmjs.com/package/cross-env 在脚本中使用此环境变量

示例脚本:

"env-cmd ./.config/prod.env cross-env-shell \"docker volume create $DOCKER_VOLUME\""

这将从prod.env加载$ DOCKER_VOLUME env var

答案 2 :(得分:-3)

如果您使用的是小型,请使用better-npm-run。对于小案例,它工作正常。不知何故,如果你有很多命令,它很难管理。试试,batman-cli。运作良好并处理许多与环境有关的问题

npm i -g batman-cli