运行 npm 任务时加载 .env 环境变量

hsz*_*hsz 4 environment-variables node.js npm

假设我们有一个.env指定了一些变量的文件:

AWS_PROFILE=hsz
ENVIRONMENT=development
Run Code Online (Sandbox Code Playgroud)

npm定义了一个简单的任务:

{
  "name": "project",
  "version": "0.0.1",
  "scripts": {
    "deploy": "sls deploy"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是跑步 npm run deploy忽略了我们的.env定义。

可以通过以下方式解决better-npm-run

{
  "name": "project",
  "version": "0.0.2",
  "scripts": {
    "deploy": "bnr deploy"
  },
  "betterScripts": {
    "deploy": "sls deploy"
  },
  "devDependencies": {
    "better-npm-run": "^0.1.1",
  }
}
Run Code Online (Sandbox Code Playgroud)

但这看起来像是开销——尤其是当我们有 10 多个任务时。

有没有更好的方法可以在.env不通过代理所有任务的情况下始终加载better-npm-run

Fai*_*ain 9

在执行 npm 脚本之前,您可以使用env-cmd npm package 设置从 .env 文件加载的环境变量。

  1. 将包添加到 package.json devDependencies 中:
npm i env-cmd -D
Run Code Online (Sandbox Code Playgroud)
  1. 在 package.json 中使用 env-cmd 程序为您的 npm 脚本添加前缀:
{
  "scripts": {
    "deploy": "env-cmd sls deploy"
  }
}
Run Code Online (Sandbox Code Playgroud)


mih*_*hai 6

有点难看,但你可以尝试这样的事情:

"scripts": {
  "deploy": "export $(cat .env | xargs) && sls deploy"
}
Run Code Online (Sandbox Code Playgroud)

这将.env在运行之前从文件中导出所有环境变量sls deploy

这个答案中,这种技术有一些变化。

不是很干净,但它避免了使用额外的模块。

  • 当 .env 文件中包含注释行时,这会崩溃,但您可以通过替换 `cat .env | 来修复它。xargs` 与 `grep '^#' .env -v | xargs` (2认同)