是否可以在 npm / package.json 中使用环境变量?

Is it possible to consume environment variables inside of npm / package.json?

我正在尝试构建一个 package.json,这样当 运行 在 Heroku 上运行 NodeJS 应用程序时,它将 运行 scripts.postinstall 使用环境变量的步骤。例如:

...
"scripts": {
  "postinstall": "command $ENV_VAR"}
},
...

我查看了 docs,但没有找到可以证明我可以的内容。

这可能吗?这甚至是可取的 "I'm Doing It Wrong"™?

由于编写了新包而更新了答案

您可以使用 cross-var 包以干净的方式执行此操作:

...
"scripts": {
  ...
  "postinstall": "cross-var command $ENV_VAR",
  ...
},
"dependencies": {
  ...
  "cross-var": "^1.1.0",
  ...
}
...

原回答

回答最后一个问题,因为它们是最重要的问题:是,否,绝对,因为您刚刚破坏了跨平台兼容性。不能保证您的环境语法适用于所有操作系统上的所有 shell,所以不要这样做。

我们已经有了一种有保证的跨平台技术:Node.js。因此,创建一个名为 bootstrap.js 的文件,然后将 npm 运行 node bootstrap 作为安装后脚本。由于 bootstrap.js 中的代码将 运行 与任何其他节点脚本一样,它将以完全跨平台兼容的方式访问 process.env,每个人都会很高兴。

还有很多很多很多使用通用工具的东西都有节点等价物,所以你可以npm在本地而不是全局安装它们,然后调用它们在 npm 脚本中。例如 mkdir -p 不是跨平台的,但是安装 mkdirp 模块是,然后像 "ensuredirs": "mkdirp dist/assets" 这样的 npm 脚本可以正常工作 everywhere 当 运行 作为 npm run ensuredirs

为了方便起见,最常见的 unix 实用程序都有自己的 运行ner 程序包,shx, which is fully cross-platform and makes the lives of devs even easier, with the "if you're writing code" equivalent being fs-extra

忽略反对者。您可以使用 cross-var:

以跨平台的方式执行此操作
"scripts": {
    "postinstall": "cross-var command $ENV_VAR"
}