如何在package.json中设置环境变量


312

如何从内部设置一些环境变量package.json以与npm start类似命令一起使用?

这是我目前所拥有的package.json

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

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


Answers:


432

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

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

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

注意:env确保它可以跨平台使用。如果只关心Mac / Linux,则可以忽略它。


65
有没有想出一个替代的Windows ..?
无限

65
@infinity use cross-env,非常易于使用。
mikekidder '16

106
@无穷大使用set NODE_ENV=test&& mocha --reporter spec-测试和&&故意之间没有空格。
杰米·彭尼

18
"test": "NODE_ENV=test mocha --reporter spec"在Windows系统上不起作用。
Benny Neugebauer

7
@infinity @ jamie-penney env NODE_ENV=test mocha --reporter spec将以本机跨平台的方式使用声明的环境变量,但关键是npm以临时和一次性的方式使用它,仅用于执行npm脚本。(它没有设置或导出以供将来参考。)只要从npm脚本运行命令,就不会有问题。同样,以这种方式删除“ &&”时也必须将其删除。
estaples

219

只需使用NPM包cross-env即可。超级容易。适用于Windows,Linux和所有环境。请注意,您没有使用&&转到下一个任务。您只需设置环境,然后开始下一个任务。感谢@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环境变量将通过交ENV被设置


三重反斜杠可用于转义所需的引号:"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
bvj

1
最佳解决方案,因为跨平台。
伯纳登'19

有人最终可以帮助我决定是否应该使用envcross-env吗?一方面,env不需要我安装任何东西,另一方面cross-env更受欢迎。有人可以确认是否env可以在所有平台上使用吗?
里沙夫

2
@Rishav env并非在所有平台上均能正常工作,因此cross-env存在。只需使用cross-env并完成它。
TetraDev

37

我只是想在这里加两美分供将来的Node-explorer使用。在我的Ubuntu 14.04上NODE_ENV=test无法正常工作,我不得不使用export NODE_ENV=test之后也NODE_ENV=test开始正常工作,很奇怪。

如前所述,您必须在Windows上使用,set NODE_ENV=test但对于跨平台解决方案,跨环境库似乎并不能解决问题,您确实需要一个库来执行此操作:

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

需要竖线,否则Windows会在无法识别的export NODE_ENV命令:D 上崩溃。邓诺(Dunno)关于尾随空间,但只是为了确保我也将其移开了。


6
你用了&&吗?NODE_ENV=test yadda手段“运行yadda,设置NODE_ENVyadda。的环境变量NODE_ENV=test && yadda的意思是‘集NODE_ENV本地环境中,但不导出它,然后运行yaddaNODE_ENV=test yadda是首选的方法。
乔许·凯利

抱歉,暂时没有检查我的stackoverflow帐户。但基本上,愚蠢的Windows无法使用NODE_ENV=test && npm run test或类似方式工作。我process.env["NODE_ENV"] = "testing";在testhelper.js文件内部使用了更好的解决方案。
TeemuK's

5
@TeemuK也只是加了我的两分钱,当您在运行命令时&&丢失了环境变量时,仅在当前命令上设置环境变量而不导出才对当前命令起作用(这没什么)。运行与环境变量的命令而不导出ü做: NODE_ENV=test npm run test。最后,它在导出后起作用的原因是,由于您的变量现在在会话中可用(导出),没有导出的NODE_ENV不会做任何事情。
Tarek

37

因为我经常发现自己使用多个环境变量,所以发现将它们保存在单独的.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)查看env变量。


很好,对我来说几乎可以完成工作!我想添加一些注释:-.env文件中不能有空行-.env文件中的注释会破坏脚本-如果多个脚本使用同一个.env文件,则必须重复执行-我以前删除的空间&&,它的工作-如果你有多个.ENV文件,它可能是一个有点困难,以保持你的回答启发了我准备这个建议:stackoverflow.com/questions/25112510/...
菲利普·莫拉ň

19

通过替换在Windows上尝试以下操作YOURENV

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

1
是! 谢谢!这就是我一直在寻找的答案!:D
Daniel Tonon

6
我必须删除&&之前的空格。
肯尼斯·索伯格

@KennethSolberg的评论是使它对我有用的最后一面(仅Windows)
ulu

我也有空间问题。当记录字符串长度时,我可以判断出空格已添加。我尝试了转义引号-并且它们实际上存储在envar中。我尝试其他定界符无济于事。解决这个问题的唯一方法是删除空间或调整值,这对我来说是错误的。
尼尔·盖·林德伯格

8

突然我发现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脚本或类似的东西中设置环境变量的更好方法,其中应用程序由其他人引导。


4

对于较大的环境变量集或要重用它们时,可以使用env-cmd

./.env 文件:

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

./package.json

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

您如何在脚本中使用ENV1?
ValRob

通常process.env.ENV1
卡拉什·伊斯特万

但是,在package.json里面?我读过那是不可能的(?)
ValRob

我不明白 为什么要这么做?
卡拉斯·伊斯特万

也许这是一个愚蠢的做法,但是我已经更新了macOs Catalina,现在mongodb命令不起作用,因此我需要指定数据/文件夹mongod --dbpath ~/data/db。我想运行类似的东西npm mongodb,它将像往常一样获取环境变量dbpath并运行mondodb ......我想与其他成员共享它。
ValRob

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
    }
}

也许这可以帮助别人


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

2

这将在Windows控制台中运行

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

npm run aaa

输出: test

有关详细信息,请参见此答案


5
应该是set TMP=test&& npm run bbb&&NODE_ENV
FisNaN

@FisNaN如果用引号引起来,则情况并非如此"
kaiser

1

您不应在中设置ENV变量package.json。actionhero用于NODE_ENV允许您更改从中的文件加载的配置选项./config。签出redis配置文件,并查看如何使用NODE_ENV更改以下版本中的数据库选项NODE_ENV=test

如果您想使用其他ENV变量来设置内容(也许是HTTP端口),则仍然不需要更改中的任何内容package.json。例如,如果您PORT=1234在ENV中进行设置,并希望将其用作HTTP端口NODE_ENV=production,则只需在相关的配置文件IE中引用它即可:

# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}

大。我认为您没有阅读我的问题..我的问题是如何设置NODE_ENV而不是它的用途。
dev.meghraj 2014年

1
如果要设置多个环境属性,请不要在npm start命令中执行。使用上面的代码段,如果要使用ENV端口运行服务器,它将是:export PORT=1234; npm start。您可以根据需要添加任意多个ENV声明,但它们不属于package.json文件。如果您担心要确保它们存在,则应在配置文件中使用默认值:port: process.env.PORT || 8080
托尼

1
可能的另一种解释方式是NODE_ENV(和其他环境变量)是环境的一部分(因此而得名)。它们通常是您在其上运行应用程序而不是应用程序的服务器的属性。您可以通过执行的命令手动设置它们,即:NODE_ENV=test npm start或由外壳设置它们
Evan 2014年

3
我不同意。在每个环境中使用./config限制了您在部署应用程序时使用静态环境。这是一种过时的哲学,不允许您在需要时启动新类型的环境。对于每个想要的新环境IE,您都必须添加.config。当您的技术堆栈需要更大的灵活性时,在运行时设置环境变量可能是一个更好的选择。我认为您的./config文件适合于设置环境的“类型”,但如果您可以在运行时定义dsn字符串和api端点之类的东西,则您的应用程序将更加灵活。
杰西·豪斯

@JesseGreathouse-我有一个node.js应用程序,我需要在运行时设置环境变量-我将在哪个文件中设置它们?
罗杰·道奇

1

npm(和yarn)将来自package.json 的大量数据作为环境变量传递到脚本中。使用npm run env一饱眼福。这在https://docs.npmjs.com/misc/scripts#environment中有记录,不仅适用于“生命周期”脚本prepublish,还适用于npm run

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

“配置”部分,似乎用于这一用途:

  "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,所以只有纱会看到它:-(


1

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


1

在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包来声明环境变量

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.