如何在package.json [Node.js]中设置环境变量

时间:2014-08-04 05:55:27

标签: npm npm-scripts

如何在package.json内设置一些环境变量,以便与npm start命令一起使用

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

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

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

16 个答案:

答案 0 :(得分:292)

在脚本命令中设置环境变量:

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

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

注意:这适用于 Mac&仅限Linux 。对于Windows,请参阅注释。

答案 1 :(得分:162)

只需使用NPM包C/C++ intrinsics即可。超级容易。适用于Windows,Linux和所有环境。请注意,您不使用&&转到下一个任务。您只需设置env然后开始下一个任务。感谢cross-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

设置

答案 2 :(得分:32)

我只想在这里为未来的Node-explorers添加两分钱。在我的Ubuntu 14.04上,NODE_ENV=test无效,我必须使用export NODE_ENV=test之后NODE_ENV=test开始工作,很奇怪。

在Windows上已经说过你必须使用set NODE_ENV=test但是对于跨平台的解决方案,交叉env库似乎没有做到这一点,你真的需要一个库来做到这一点: / p>

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

需要垂直条,否则Windows会在无法识别的export NODE_ENV命令上崩溃:D。关于尾随空间的Dunno,但也确定我也删除了它们。

答案 3 :(得分:7)

突然我发现actionhero正在使用以下代码,它通过在启动脚本命令选项中传递--NODE_ENV=production来解决我的问题。

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

我真的很感激接受其他人的回答,他们知道更好的方法在package.json或init脚本中设置环境变量,或者其他类似的地方,其中app由其他人引导。

答案 4 :(得分:7)

在Windows中使用git bash。 Git Bash处理命令的方式不同于cmd。

使用NODE_ENV = production设置环境变量时,大多数Windows命令提示符都会阻塞。 (Windows上的Bash是例外,它使用本机Bash。)类似地,Windows和POSIX命令使用环境变量的方式也有所不同。对于POSIX,您使用:$ ENV_VAR,在Windows上使用%ENV_VAR%。-跨环境文档

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

使用dotenv包声明环境变量

答案 5 :(得分:5)

在Windows上通过替换YOURENV来尝试此操作:

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV&& tagove help",
       "start": "set NODE_ENV=YOURENV&& tagove start"
     }
    ...
  }

答案 6 :(得分:4)

由于我经常发现自己使用多个环境变量,因此将它们保存在单独的.env文件中非常有用(请确保从源代码管理中忽略它)。

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

然后在脚本命令前加export $(cat .env | xargs) &&

示例:

{
  ...
  "scripts": {
    ...
    "start": "export $(cat .env | xargs) && echo do your thing here",
    "env": "export $(cat .env | xargs) && env",
    "env-windows": "export $(cat .env | xargs) && set"
  }
  ...
}

要进行测试,您可以通过运行npm run env(Linux)或npm run env-windows(Windows)来查看环境变量。

答案 7 :(得分:4)

npm(和毛线)将package.json中的很多数据作为环境变量传递到脚本中。使用npm run env查看所有内容。 https://docs.npmjs.com/misc/scripts#environment中对此进行了记录,不仅适用于prepublish之类的“生命周期”脚本,还适用于npm run执行的任何脚本。

您可以访问这些内部代码(例如JS中的process.env.npm_package_config_port),但是运行脚本的外壳程序已经可以使用它们,因此您也可以在“脚本”中以$npm_...扩展名的形式访问它们( Unix语法,可能无法在Windows上使用?)。

"config" section似乎用于此用途:

  "name": "myproject",
  ...
  "config": {
    "port": "8010"
  },
  "scripts": {
    "start": "node server.js $npm_package_config_port",
    "test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
  } 

这些“配置”字段的重要特征是用户可以覆盖它们而无需修改package.json

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8010

$ npm config set myproject:port 8020
$ git diff package.json  # no change!
$ cat ~/.npmrc
myproject:port=8020

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8020

请参阅npm configyarn config文档。
似乎纱线读取~/.npmrc,因此npm config set会同时影响这两者,但是yarn config set会写入~/.yarnrc,因此只有纱线会看到它:-(

答案 8 :(得分:3)

@luke的答案几乎是我需要的答案!谢谢。

由于选择的答案非常简单(而且是正确的),但是很旧,我想提供一种替代方法,用于在运行脚本并修复Luke答案的某些限制时从.env单独的文件中导入变量。 试试这个:

:::。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"

然后,在包json中,您将创建一个脚本,该脚本将设置变量并在需要它们的脚本之前运行它:

::: package.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 set-env或使用npm run set-env --scripts-prepend-node-path &&

不同的环境

使用它的另一个优点是您可以具有不同的环境变量。

scripts: {
  "set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
  "set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}

请记住,如果其中包含密钥,密码或敏感/个人数据,请不要将.env文件添加到git存储库中!

答案 9 :(得分:2)

虽然没有直接回答这个问题,但我想在其他答案之上分享一个想法。从我得到的每一个都会提供一定程度的复杂性来实现跨平台的独立性。

在我的场景中,我最初想要设置一个变量来控制是否使用JWT身份验证来保护服务器(用于开发目的)

在阅读完答案后,我决定只创建2个不同的文件,分别打开和关闭身份验证。

  "scripts": {
    "dev": "nodemon --debug  index_auth.js",
    "devna": "nodemon --debug  index_no_auth.js",
  }

这些文件只是调用原始index.js文件的包装器(我将其重命名为appbootstrapper.js):

//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

也许这可以帮助别人

答案 10 :(得分:1)

您不应在package.json中设置ENV变量。 actionhero使用NODE_ENV允许您更改从./config中的文件加载的配置选项。查看redis config file,了解如何使用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
      }
    }
  }
}

答案 11 :(得分:1)

{
  ...
  "scripts": {
    "start": "ENV NODE_ENV=production someapp --options"
  }
  ...
}

答案 12 :(得分:1)

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

./.env文件:

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

./package.json

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

答案 13 :(得分:1)

对于单个环境变量

 "scripts": {
    "start": "set NODE_ENV=production&& node server.js"
 }

对于多个环境变量

 "scripts": {
    "start": "set NODE_ENV=production&& set PORT=8000&& node server.js"
 }

答案 14 :(得分:0)

这将在 Windows控制台中起作用:

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

输出: test

有关详细信息,请参见this answer

答案 15 :(得分:0)

注意::要设置多个环境变量,脚本应如下所示

  "scripts": {
    "start": "set NODE_ENV=production&& set MONGO_USER=your_DB_USER_NAME&& set MONGO_PASSWORD=DB_PASSWORD&& set MONGO_DEFAULT_DATABASE=DB_NAME&& node app.js",
  },