在 npm-scripts 中传递环境变量

Posted

技术标签:

【中文标题】在 npm-scripts 中传递环境变量【英文标题】:Passing environment variables in npm-scripts 【发布时间】:2016-09-05 13:34:43 【问题描述】:

我有一个 package.json,在 scripts 键中有以下(简化的)内容:

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

...

我可以从命令行运行:

npm start

这将运行我的 start-app.js 脚本并将 process.env.NODE_ENV 环境变量设置为“生产”。语法解释见here。

按照here 的描述,poststart 将在启动后自动运行。

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

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

我不想在启动后硬编码 NODE_ENV,因为我可能想做:

NODE_ENV=development npm start

我希望每个“下游”都继承相同的环境。

【问题讨论】:

来自what I see,他的 package.json 字段被附加到 npm_package 前缀_上,所以你可能想说npm_package_node_env 运行多个命令时,您应该export 变量。 export NODE_ENV=something 【参考方案1】:

你有几个选择:

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

【讨论】:

当您回显时,NODE_ENV 是否仍然可用?我体验到它已经消失了,参考 npmjs.com/package/cross-env#known-limitations 正确,cross-env 这是不可能的。第二个示例实际上分配了一个环境变量(不使用 cross-env)。 @MarioTacke 我刚刚对此进行了测试,它没有分配变量。如果在npm start 命令之前设置它,它可以工作(在start 脚本命令中)。 @kaiser 这取决于您的环境。你能概述一下在你的情况下什么有效和无效吗?以上是poststart 脚本。 cross-env 最近也发生了重大变化。 我刚刚在 node:8-alpine Docker 容器中测试了这个,运行 Nodejs v8 和 NPM v5,并且容器中分配的变量保持不变。无论如何,我相信我们有一个误解:你谈论分配一个变量,如果 它还没有分配,而我理解它会覆盖以前设置的变量(@987654334 @),对吧?【参考方案2】:

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

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-cmd 版本 10 开始,如果要使用自定义 env 文件路径,则需要指定 -f 标志

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

【讨论】:

这几乎对我有用,但我不得不在 cross-env-shell 之后删除引号,如下所示:"env-cmd -f ./.env cross-env-shell docker compose build app --build-arg NPM_TOKEN=$NPM_TOKEN"【参考方案3】:

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

npm i -g batman-cli

【讨论】:

以上是关于在 npm-scripts 中传递环境变量的主要内容,如果未能解决你的问题,请参考以下文章

将环境变量传递给 application.yml

如何将环境变量传递给pytest

将环境变量传递给 XCUITest

如何将环境变量传递给前端 Web 应用程序?

将环境变量传递给多个命令

在运行时将环境变量传递给 Vue 应用程序