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

um6iljoc  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(473)

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

mnemlml8

mnemlml81#

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

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

这将在运行sls deploy之前从.env文件中导出所有环境变量。
this answer中,此技术有一些变化。
不是很干净,但它避免了使用额外的模块。

alen0pnh

alen0pnh2#

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

cnh2zyt33#

在项目本身中维护并加载所有环境特定配置。
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;
./config.js中,默认环境设置为dev
使用这个简单的实践,您不需要任何npm模块来管理您的环境配置。

zaqlnxep

zaqlnxep4#

我在尝试使用外部命令同步数据库时遇到了同样的问题,并通过要求dotenv包(将加载变量)修复了该问题

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

那么就调用npm run db-sync

相关问题