在npm-scripts中传递环境变量

Han*_*ans 34 shell environment-variables node.js npm

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

...
scripts: {
   "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js",
   "poststart": "echo $NODE_ENV"
}
...
Run Code Online (Sandbox Code Playgroud)

从命令行我可以运行:

npm start
Run Code Online (Sandbox Code Playgroud)

这将运行我的start-app.js脚本并将process.env.NODE_ENV环境变量设置为"production".请参阅此处获取语​​法说明.

如上所述启动后会自动开始运行后这里.

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

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

我不想在poststart中硬编码NODE_ENV,因为我可能想要:

NODE_ENV=development npm start
Run Code Online (Sandbox Code Playgroud)

我希望每一个"沿着链条"继承同样的环境.

Mar*_*cke 16

你有几个选择:

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


tyl*_*lim 6

我就是这样做的,首先你需要安装两个开发依赖项

https://www.npmjs.com/package/env-cmd 这会从您的文件中加载您的 env var

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

示例脚本:

"env-cmd ./.config/prod.env cross-env-shell \"docker volume create $DOCKER_VOLUME\""
Run Code Online (Sandbox Code Playgroud)

这从 prod.env 加载 $DOCKER_VOLUME env var

更新:从 env-cmd 版本 10 开始,如果要使用自定义 env 文件路径,则需要指定 -f 标志

"env-cmd -f ./.config/prod.env cross-env-shell \"docker volume create $DOCKER_VOLUME\""
Run Code Online (Sandbox Code Playgroud)