2

我假设 PM2 在启动时以“本机”系统方式附加 env vars,例如:

 MYVAR=hey; node app.js

dotenvnpm 包的不同之处在于它必须以另一种方式附加 vars,因为它在脚本中工作(它不能这样做MYVAR=someothervar; node app.js,因为程序已经启动),所以它的工作方式如下:

dotenv.config() //reads .env file and appends stuff to process.env at runtime

现在说 PM2 启动MYVAR=hey; node app.js,然后在我们运行的 app.jsdotenv.config()中读取一个包含 .env 的 .env 文件MYVAR=foo。哪个变量将在 process.env 中?

生态系统.config.js

{
  //...standard pm2 config above
  env: {
     MYVAR: 'ecosystem',
   },
}

.env/dotenv

MYVAR=dotenv

代码

dotenv.config()
console.log(process.env.MYVAR)
4

1 回答 1

2

dotenv.config()process.env如果它发现变量已经存在于(它们已被分配到 PM2MYVAR=foo; node app.js方式 )中,则不会覆盖变量。

因此,在启动之前设置的进程环境将优先。

这实际上在 dotenv 的 README 中。

已经设置的环境变量会发生什么?

我们永远不会修改任何已经设置好的环境变量。特别是,如果您的 .env 文件中有一个变量与您的环境中已经存在的变量发生冲突,那么该变量将被跳过。此行为允许您使用特定于机器的环境覆盖所有 .env 配置,但不建议这样做。

https://www.npmjs.com/package/dotenv#what-happens-to-environment-variables-that-were-already-set

如果您绝对需要覆盖现有的环境变量 - 使用dotenv-override包。

于 2019-06-25T19:30:06.350 回答