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

时间:2018-11-09 06:48:39

标签: node.js npm environment-variables

假设我们有一个.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代理所有任务?

3 个答案:

答案 0 :(得分:2)

有点丑陋,但是您可以尝试执行以下操作:

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

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

this answer中的这种技术有些变化。

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

答案 1 :(得分: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模块来管理您的环境配置。

答案 2 :(得分:0)

在执行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"
  }
}