如何从包中设置一些环境变量。Json使用NPM启动像命令?
以下是我目前在package.json中的内容:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
我想在启动脚本中设置环境变量(如NODE_ENV),同时仍然能够用一个命令启动应用程序,npm start。
如何从包中设置一些环境变量。Json使用NPM启动像命令?
以下是我目前在package.json中的内容:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
我想在启动脚本中设置环境变量(如NODE_ENV),同时仍然能够用一个命令启动应用程序,npm start。
当前回答
对于单个环境变量
"scripts": {
"start": "set NODE_ENV=production&& node server.js"
}
对于多个环境变量
"scripts": {
"start": "set NODE_ENV=production&& set PORT=8000&& node server.js"
}
其他回答
因为我经常需要处理多个环境变量,所以我发现将它们保存在一个单独的.env文件中很有用(请确保在源代码控制中忽略这一点)。然后(在Linux中)在启动应用程序之前在脚本命令中前置export $(cat .env | xargs) &&。
例如。env文件:
VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break
示例index.js:
console.log('Test', process.env.VAR_A, process.env.VAR_B);
示例package.json:
{
...
"scripts": {
"start": "node index.js",
"env-linux": "export $(cat .env | xargs) && env",
"start-linux": "export $(cat .env | xargs) && npm start",
"env-windows": "(for /F \"tokens=*\" %i in (.env) do set %i)",
"start-windows": "(for /F \"tokens=*\" %i in (.env) do set %i) && npm start",
}
...
}
不幸的是,我似乎不能通过从脚本中调用脚本来设置环境变量——比如“start-windows”:“npm run env-windows && npm start”——所以脚本中有一些冗余。
对于一个测试,你可以通过运行npm run env-linux或npm run env-windows来查看env变量,并通过运行npm run start-linux或npm run start-windows来测试它们是否进入了你的应用程序。
从包中运行node.js脚本。带有多个环境变量的Json:
包中。json文件:
"脚本":{ "set NODE_ENV=prod4 && set LOCAL_RUN=true && node ./x.js", },
X.js文件可以是:
let env = process.env.NODE_ENV; let isLocal = process.env.LOCAL_RUN; console.log("ENV", ENV); console.log(“isLocal”,isLocal);
你不应该在package.json中设置ENV变量。actionhero使用NODE_ENV允许您更改从./config文件中加载的配置选项。检查redis配置文件,并查看如何使用NODE_ENV来更改NODE_ENV=test中的数据库选项
如果你想使用其他ENV变量来设置东西(也许是HTTP端口),你仍然不需要改变package.json中的任何东西。例如,如果你在ENV中设置了PORT=1234,并且想在NODE_ENV=production中使用它作为HTTP端口,只需在相关的配置文件IE中引用它:
# in config/servers/web.js
exports.production = {
servers: {
web: function(api){
return {
port: process.env.PORT
}
}
}
}
只需使用NPM包cross-env。超级简单。适用于Windows、Linux和所有环境。注意,不要使用&&来移动到下一个任务。您只需设置env,然后开始下一个任务。感谢@mikekidder在这里的一个评论中的建议。
从文档:
{
"scripts": {
"build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
}
}
注意,如果您想设置多个全局变量,您只需连续地声明它们,然后再加上要执行的命令。
最终,执行的命令(使用spawn)是:
webpack --config build/webpack.config.js
NODE_ENV环境变量将由cross-env设置
@luke的回答几乎就是我需要的!谢谢。
由于所选的答案非常简单(而且正确),但是很旧,我想提供一个替代方案,用于在运行脚本时从.env单独文件导入变量,并修复Luke的答案的一些限制。 试试这个:
::: .env文件:::
# This way, you CAN use comments in your .env files
NODE_PATH="src/"
# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"
然后,在你的package json中,你将创建一个设置变量的脚本,并在你需要它们的脚本之前运行它:
:::包。json:::
scripts: {
"set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
"storybook": "npm run set-env && start-storybook -s public"
}
一些观察:
grep'ed cat命令中的正则表达式将清除注释和空行。 &&不需要“粘”到npm run set-env上,因为如果你在同一个命令中设置变量,就需要这样做。 如果你正在使用yarn,你可能会看到一个警告,你可以把它改成yarn set-env,或者用npm run set-env——scripts- prepending -node-path &&代替。
不同的环境
使用它的另一个优点是可以使用不同的环境变量。
scripts: {
"set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
"set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}
请记住,当你有密钥、密码或敏感/个人数据时,不要将.env文件添加到git存储库中!