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

问题描述 投票:0回答:5

假设我们有一个

.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
代理所有任务?

node.js npm environment-variables
5个回答
16
投票

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

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

这将在运行

.env
之前从
sls deploy
文件中导出所有环境变量。

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

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


9
投票

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

  1. 将包添加到 package.json devDependencies 中:
npm i env-cmd -D
  1. 在 package.json 中使用 env-cmd 程序作为 npm 脚本的前缀:
{
  "scripts": {
    "deploy": "env-cmd sls deploy"
  }
}

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 - 每次项目启动时调用节点项目根文件

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 模块来管理您的环境配置。


0
投票
// .env
MY_ENV_VAR: '46a69247498a030'

// package.json:
"scripts": {
  "myscript1": "node myscript-cmd --cmd_name=script1",
  "myscript2": "node myscript-cmd --cmd_name=script2"
},

// myscript-cmd.js (placed at the root of your project directory)
if (cmdVarValue === "myscript1") {
  // requirements...
  require("dotenv").config();
  const execSync = require("child_process").execSync;

  execSync(`echo hello: ${process.env.MY_ENV_VAR}`, {
    stdio: [0, 1, 2],
  });

} else if(cmdVarValue === "myscript2"){
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.