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

Posted

技术标签:

【中文标题】是否可以在 npm / package.json 中使用环境变量?【英文标题】:Is it possible to consume environment variables inside of npm / package.json? 【发布时间】:2016-01-03 23:11:39 【问题描述】:

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

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

我查看了docs 并没有找到可以说明的内容。

这甚至可能吗?这甚至是可取的和“我做错了”™?

【问题讨论】:

【参考方案1】:

忽略反对者。您可以使用cross-var 以跨平台方式执行此操作:

"scripts": 
    "postinstall": "cross-var command $ENV_VAR"

【讨论】:

(但请注意,发布此问题时不存在交叉变量)【参考方案2】:

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

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

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

...

原答案

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

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

而且许多、许多、许多 使用通用工具的东西都有节点等价物,因此您可以npm 在本地而不是全局安装它们,然后在 npm 脚本中调用它们。例如mkdir -p 不是跨平台的,但安装mkdirp 模块是,然后像"ensuredirs": "mkdirp dist/assets" 这样的npm 脚本在以npm run ensuredirs 运行时工作正常任何地方

为了方便起见,最常见的 unix 实用程序都有自己的运行程序包,shx,它是完全跨平台的,使开发人员的生活更加轻松,“如果你正在编写代码”相当于 @ 987654323@.

【讨论】:

以上是关于是否可以在 npm / package.json 中使用环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

将您的电子邮件地址放在npm模块的package.json中是否安全?

检查 NPM package.json 和 package-lock.json 是不是兼容

通过终端检查 npm 包是不是安装在 package.json 中

是否应该将 package-lock.json 提交到 npm 包的存储库?

package-lock.json 在 npm install 之后被重写

是否可以从 package.json 的目录之外运行 package.json 中定义的脚本?