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

10
假设我们有一个指定了一些变量的.env文件:
AWS_PROFILE=hsz
ENVIRONMENT=development

还有一个简单的npm任务定义:

{
  "name": "project",
  "version": "0.0.1",
  "scripts": {
    "deploy": "sls deploy"
  }
}

但是运行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",
  }
}

但这似乎是一种额外的负担,特别是当我们有10个以上的任务时。

是否有更好的方法可以始终加载.env而不通过better-npm-run代理所有任务?

4个回答

15

有点丑,但你可以尝试这样做:

"scripts": {
  "deploy": "export $(cat .env | xargs) && sls deploy"
}

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

这个答案中有一些变化的技巧。

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


2
当您的.env文件中有注释行时,这将导致崩溃,但您可以通过将“cat .env | xargs”替换为“grep '^#' .env -v | xargs”来修复它。 - Flinth

9
您可以使用 env-cmd npm 包,在执行 npm 脚本之前设置从 .env 文件中加载的环境变量。
  1. 将包添加到您的 package.json 的 devDependencies 中:
npm i env-cmd -D
  1. 在 package.json 中,在 npm 脚本前加上 env-cmd 程序:
{
  "scripts": {
    "deploy": "env-cmd sls deploy"
  }
}

被接受的答案对于Windows不起作用,不像这个答案 ;) - Lior Dahan

1

我在尝试使用外部命令同步数据库时遇到了相同的问题,通过要求dotenv包来加载变量解决了该问题。

"scripts": {
"db-sync": "node --require dotenv/config ./src/sequelize/sync.js"}

然后只需要调用 npm run db-sync


0

在项目本身中维护和加载所有特定于环境的配置。

dev.js

module.exports = {
    "host":"dev.com"
}

prod.js

module.exports = {
    "host":"prod.com"
}

config.js - 主要文件,将根据 process.env.ENV 变量解析配置。

const dev = require('./dev');
const prod = require('./prod');
let envObject = {};
const env = process.env.ENV || "dev";
switch(env) {
    case 'prod':
        envObject = prod;
        break;
    default:
        envObject = dev;
}
envObject['ENV'] = env;
process.env = Object.assign(process.env,envObject); // Optional if you prefer to add them into process environment otherwise `require('./config')` where you need configuration. 
module.exports = envObject;

index.js - node 项目的根文件,在每次启动项目时都会被调用

const config = require('./config');
console.log('config object => ',config.host);

package.json

{
  "name": "project",
  "version": "0.0.2",
  "scripts": {
    "deploy": "sls deploy"
  }
}

运行你的node.js代码 生产环境 ENV=prod npm run deploy; 开发环境 - npm run deploy;

默认环境设置为dev./config.js

使用这种简单的方法,您不需要任何npm模块来管理您的环境配置。


谢谢,但重点是要避免在任何环境变量前加上 npm run 前缀;而且在运行 sls deploy - 外部工具 - 没有加载 index.js - hsz
或者在项目根目录中创建一个 .npmrc 文件并在其中设置变量。https://docs.npmjs.com/files/npmrc#files - front_end_dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接