关于node.js:运行npm任务时加载.env环境变量

Load .env environment variables when running npm task

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

1
2
AWS_PROFILE=hsz
ENVIRONMENT=development

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

1
2
3
4
5
6
7
{
 "name":"project",
 "version":"0.0.1",
 "scripts": {
   "deploy":"sls deploy"
  }
}

但runnning npm run deploy忽略了我们的.env定义。

它可以用better-npm-run解决,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
 "name":"project",
 "version":"0.0.2",
 "scripts": {
   "deploy":"bnr deploy"
  },
 "betterScripts": {
   "deploy":"sls deploy"
  },
 "devDependencies": {
   "better-npm-run":"^0.1.1",
  }
}

但这看起来像一个开销 - 特别是当我们有10个以上的任务时。

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


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

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

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

在这个答案中,这个tehnique有一些变化。

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


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

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


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

    dev.js

    1
    2
    3
    module.exports = {
       "host":"dev.com"
    }

    prod.js

    1
    2
    3
    module.exports = {
       "host":"prod.com"
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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 - 每次项目启动时节点项目根文件调用

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

    的package.json

    1
    2
    3
    4
    5
    6
    7
    {
     "name":"project",
     "version":"0.0.2",
     "scripts": {
       "deploy":"sls deploy"
      }
    }

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

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

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