如何在 package.json 的 npm 脚本中使用 SECRET_ENV?

Posted

技术标签:

【中文标题】如何在 package.json 的 npm 脚本中使用 SECRET_ENV?【英文标题】:How can I use SECRET_ENV in npm scripts inside of package.json? 【发布时间】:2020-01-22 13:49:21 【问题描述】:

我有一个名为API_KEY 的密钥,我想在package.jsonscripts 中访问它。

package.json


   "scripts": 
      "start": "web-ext run --api-key=API_KEY"
   

我的.env 文件包含API_KEY

API_KEY=abc123

我怎样才能在package.jsonscripts 中访问API_KEY 的值,同时仍然保密,因为我需要公开推送package.json

目前,我做了以下工作,但不能跨平台:

package.json


   "scripts": 
      "start": "web-ext run --api-key=$API_KEY"
   

当运行start 脚本时,我会这样做:

API_KEY=abc123 npm start

这要归功于 Bash 编程语言,但它不适用于 Windows。我需要用%API_KEY% 替换start 脚本中的$API_KEY。但我希望它是跨平台的。有没有其他办法?

【问题讨论】:

为什么不简单地使用名为 config.js 的 js 文件创建一个名为 config 的目录,然后对该 api 密钥进行模块导出?比复制该文件并将其命名为 config.js.example 将是空的,并在 .gitignore 中排除文件? How to set environment variables from within package.json的可能重复 @DᴀʀᴛʜVᴀᴅᴇʀ imo 这不是重复的,因为我想保持环境变量值私有。有一个包含env-cmd 的答案可能适用于我的情况,但它不能,因为我想将变量用作--api-key 的参数,所以根据github.com/toddbluhm/env-cmd-examples/issues/… 无法做到这一点 "当运行 start 脚本时,我会像 API_KEY=abc123 npm start" - 当你有一个 cli 参数时,为什么还要使用环境变量呢?只需从 package.json 中删除 --api-key=API_KEY - 跨平台兼容性没有问题 - 并像 npm start --api-key=abc123 一样调用它。 @Bergi 我仍然需要记住参数--api-key--api-secret。因此,我发现我自己的解决方案在问题中得到了很好的建议。让它在 Windows 上运行的唯一方法是将$API_KEY 更改为%API_KEY%。当我发布问题时,我认为存在一个更简单的解决方案,但不幸的是它没有:( 【参考方案1】:

您可以简单地要求“dotenv”库,并从 process.env.SOME_KEY 访问 var

【讨论】:

不,dotenv 不是这样工作的 AFAICT。我需要在package.json > scripts 而不是*.js 文件中访问它。 dotenv需要先加载,然后在*.js文件中使用:)【参考方案2】:

跨平台

1) 您可以使用 'npm env-cmd' 作为 devDependencies

从文件设置环境

用法

环境文件./.env

# This is a comment
API_KEY=abc123

Package.json


  "scripts": 
    "start": "env-cmd web-ext run"
  


2) 您可以使用 'npm cross-env' 作为 devDependencies

跨平台运行设置和使用环境变量的脚本

用法


  "scripts": 
    "start": "cross-env API_KEY=abc123 web-ext run"
  


仅适用于 Windows

你可以试试这样的:

cmd /C "set API_KEY=abc123 && npm start"

作为Viper_Sb says here:

/C 运行后立即退出新的 cmd,如果你用新的产生输出,它仍然会在父窗口中可见。

您可以选择使用 /K,在这种情况下,新的 cmd 窗口在运行结束时保持打开状态。

【讨论】:

不能使用env-cmd,因为我想将它作为参数传递给--api-key。不能使用 cross-env,因为我需要将值 abc123 保密。第三个只有 Windows :( env-cmd 在这个问题上对我不起作用→github.com/toddbluhm/env-cmd-examples/issues/… 这正是我想要做的【参考方案3】:

到目前为止,我发现的唯一其他可行的答案有点老套:


   "scripts": 
      "start": "web-ext run --api-key=$(grep API_KEY .env | cut -d '=' -f2)"
   

[https://***.com/a/58038814/1822977]

【讨论】:

以上是关于如何在 package.json 的 npm 脚本中使用 SECRET_ENV?的主要内容,如果未能解决你的问题,请参考以下文章

与 npm 和 yarn 一起使用的 package.json 脚本?

npm package.json:如何包装长的单个函数脚本?

我应该在 NPM package.json 中将我的“启动”脚本设置为啥?

npm脚本和package.json

npm脚本探析

npm 脚本使用 package.json 中指定的版本重命名文件