我正在创建一个基于Express的Node.JS项目,我正在尝试设置环境变量以将开发与生产流量分开。我创建了一个shell脚本文件,其中包含NODE_ENV
或DEBUG
等一些env变量,当我在命令行上运行predevelop
时由npm run develop
脚本执行,但变量是在predevelop
完成执行后丢失,并在Express应用程序运行时获得undefined
。
这是./scripts/development.sh
#!/bin/sh
echo 'Setting up development env';
export NODE_ENV='development';
export NODE_DEBUG='http';
export DEBUG='project:server';
echo 'NODE_ENV => '$NODE_ENV;
echo 'NODE_DEBUG => '$NODE_DEBUG;
echo 'DEBUG => '$DEBUG;
exit 0;
这是我的package.json
脚本
{
// ...
"scripts": {
"predevelop": "/bin/bash ./scripts/development.sh",
"develop": "echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www"
}
// ...
}
npm run develop
的控制台输出:
┌─ [ jcorradi ] ~/Sites/pocs/project-server
└─• npm run develop
> project-server@0.0.0 predevelop /home/jcorradi/Sites/pocs/project-server
> /bin/bash ./scripts/development.sh
Setting up development env
NODE_ENV => development
NODE_DEBUG => http
DEBUG => project:server
> project-server@0.0.0 develop /home/jcorradi/Sites/pocs/project-server
> echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www
NODE_ENV =>
NODE_DEBUG =>
DEBUG =>
// From ./bin/www
NODE_ENV => undefined
NODE_DEBUG => undefined
DEBUG => undefined
有人知道这是最好的实践还是有其他方法可以使这项工作?
Obs:我已经尝试过直接在npm脚本上设置env var,但这仍然会失败。
例如:
{
// ...
"scripts": {
"predevelop": "NODE_ENV='development'; NODE_DEBUG='http'; DEBUG='project:server';",
"develop": "echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www"
}
// ...
}
答案 0 :(得分:1)
如果您不想如上所述通过参数,您可以随时执行此类操作。
的package.json
"scripts": {
"start": ". development.sh | node path/to/app/www"
}
在项目根运行中" npm start" (还假设development.sh在您的项目根目录中)。这将执行development.sh bash脚本,然后执行节点脚本。
两个注释:
我记得读上面的语法可能略微依赖于你的操作系统/节点版本。因此,如果您遇到任何问题,请考虑到这一点。
此外,在节点脚本中,环境变量将是过程对象上的键/值。这有助于了解调试目的。
答案 1 :(得分:1)
有人知道这是最好的实践还是有其他方法可以使这项工作?
最佳做法是避免在package.json中设置环境变量,因为这应该与环境无关,以便支持没有bash或在/usr/bin/bash
中安装bash的环境
假设您不关心该约束,那么实现此功能的方法是在实际运行命令中执行您的环境:
{
"scripts": {
"develop": "NODE_ENV=development NODE_DEBUG=http DEBUG=project:server node ./bin/www"
}
}