假设我们有一个
.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
代理所有任务?
有点难看,但你可以尝试这样的事情:
"scripts": {
"deploy": "export $(cat .env | xargs) && sls deploy"
}
这将在运行
.env
之前从 sls deploy
文件中导出所有环境变量。
这个答案中的这种技术有一些变化。
不是很干净,但它避免了使用额外的模块。
在执行 npm 脚本之前,您可以使用 env-cmd npm 包设置从 .env 文件加载的环境变量。
npm i env-cmd -D
{
"scripts": {
"deploy": "env-cmd sls deploy"
}
}
我在尝试使用外部命令同步数据库时遇到了同样的问题,并通过需要
dotenv
包来加载变量来解决该问题
"scripts": {
"db-sync": "node --require dotenv/config ./src/sequelize/sync.js"}
那就打电话吧
npm run db-sync
在项目本身中维护和加载所有环境特定配置。
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 模块来管理您的环境配置。
// .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"){
...
}