如何从包中设置一些环境变量。Json使用NPM启动像命令?

以下是我目前在package.json中的内容:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

我想在启动脚本中设置环境变量(如NODE_ENV),同时仍然能够用一个命令启动应用程序,npm start。


当前回答

对于更大的环境变量集,或者当你想重用它们时,可以使用env-cmd。

另外,.env文件也可以与direnv一起工作。

。/。env文件:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

/ package.json:

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}

其他回答

在script命令中设置环境变量:

...
"scripts": {
  "start": "node app.js",
  "test": "NODE_ENV=test mocha --reporter spec"
},
...

然后使用process.env。NODE_ENV在你的应用中。

注意:这只适用于Mac和Linux。对于Windows,请参阅注释。

对于更大的环境变量集,或者当你想重用它们时,可以使用env-cmd。

另外,.env文件也可以与direnv一起工作。

。/。env文件:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

/ package.json:

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}

因为我经常需要处理多个环境变量,所以我发现将它们保存在一个单独的.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来测试它们是否进入了你的应用程序。

@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存储库中!

突然我发现actionhero正在使用以下代码,这解决了我的问题,只是通过传递——NODE_ENV=生产在启动脚本命令选项。

if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

我真的很感激接受其他人的答案谁知道更多更好的方法设置包中的环境变量。Json或init脚本,这些都是由别人引导的。