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

dev*_*raj 258 node.js npm package.json npm-scripts

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

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

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

ces*_*sar 349

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

...
"scripts": {
  "start": "node app.js",
  "test": "NODE_ENV=test mocha --reporter spec"
},
...
Run Code Online (Sandbox Code Playgroud)

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

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

  • @infinity使用`set NODE_ENV = test && mocha --reporter spec` - 测试和&&之间没有空间. (93认同)
  • 有人找到了替代窗户..? (64认同)
  • @infinity使用[cross-env](https://www.npmjs.com/package/cross-env)并且非常易于使用. (62认同)
  • `"test":"NODE_ENV = test mocha --reporter spec"`不适用于Windows系统. (16认同)
  • @infinity @jamie-penney`env NODE_ENV = test mocha --reporter spec`将以原生的跨平台方式使用声明的环境变量,但关键是npm以临时和一次性的方式使用它,用于npm脚本执行.(它未设置或导出以供将来参考.)只要您从npm脚本运行命令,就没有问题.此外,这样做时必须删除"&&". (5认同)
  • “注意:env 确保它可以跨平台工作。”如何?`env` 在 Windows 上不是有效命令。 (5认同)
  • 谢谢@JamiePenney.我必须在&&之前移除空间以使其工作.这是为什么?`set NODE_ENV = development &&(nexttask) (4认同)
  • @infinity 可以在 Windows 上设置多个环境变量,如下所示: "scripts": { "start": "node index.js", "set:env:this:way": "env FIRST=一个 env SECOND=两个节点索引.js"}, (3认同)
  • cross-env为我工作了几秒钟.如果只需要它来进行npm测试,请考虑仅使用--save-dev添加它 (2认同)
  • 如果您确实使用跨环境,则无需包含“&&”。示例:`cross-env NODE_ENV=测试业力开始` (2认同)
  • 你在这里指的“env”是什么?你能发布一个链接吗? (2认同)

Tet*_*Dev 191

只需使用NPM包交叉环境.超级容易.适用于Windows,Linux和所有环境.请注意,您不使用&&移动到下一个任务.您只需设置env然后开始下一个任务.感谢@mikekidder在建议的意见,一个在这里.

来自文档:

{
  "scripts": {
    "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要设置多个全局变量,只需连续声明它们,然后执行命令即可.

最终,执行的命令(使用spawn)是:

webpack --config build/webpack.config.js
Run Code Online (Sandbox Code Playgroud)

NODE_ENV环境变量将通过交ENV被设置

  • 最佳解决方案,因为跨平台。 (3认同)
  • @Rishav `env` 并不在所有平台上按原样工作,因此是 `cross-env` 存在的原因。只需使用“cross-env”即可完成。 (3认同)
  • 三重反斜杠可用于转义所需的引号: `"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"` (2认同)

Tee*_*muK 35

我只想在这里为未来的Node-explorers添加两分钱.在我的Ubuntu 14.04上NODE_ENV=test没有用,我不得不使用export NODE_ENV=test之后NODE_ENV=test开始工作,很奇怪.

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

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda
Run Code Online (Sandbox Code Playgroud)

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

  • 你用过`&&`吗?`NODE_ENV = test yadda`表示"运行`yadda`,在`yadda`的环境变量中设置`NODE_ENV`.`NODE_ENV = test && yadda`表示在本地环境中设置`NODE_ENV`,但不导出它,然后运行`yadda`."`NODE_ENV = test yadda`是首选方法. (6认同)
  • @TeemuK也只是添加我的两美分,当你用`&&'运行你的命令时你丢失了你的环境变量,设置环境变量而没有导出只对当前命令起作用(这没什么).使用env变量运行命令而不导出u do:`NODE_ENV = test npm run test`.最后导出后它工作的原因是因为ur变量现在在会话中可用(导出),你的NODE_ENV没有导出就没有做任何事情. (4认同)

Luk*_*uke 20

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

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break
Run Code Online (Sandbox Code Playgroud)

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

例:

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break
Run Code Online (Sandbox Code Playgroud)

为了进行测试,您可以通过运行npm run env(linux)或npm run env-windows(windows)查看env变量。

  • 非常好,它几乎完成了我的工作!我想添加一些注释: - .env 文件中不能有空行 - .env 文件中的注释会破坏脚本 - 如果多个脚本使用同一个 .env 文件,则必须重复该操作 -我必须删除“&&”之前的空格才能工作 - 如果您有多个 .env 文件,维护起来可能会有点困难您的回答启发我准备了这个建议:/sf/ 25112510/如何从package-json内设置环境变量/61052350#61052350 (3认同)

kar*_*agi 15

NODE_ENV环境变量设置为“生产”时package.json,运行 npm install 时文件中的所有 devDependency 将被完全忽略。您还可以使用标志来强制执行此操作--production

npm install --production
Run Code Online (Sandbox Code Playgroud)

对于设置,NODE_ENV您可以使用以下任何一种方法

方法1NODE_ENV :为所有节点应用程序设置

Windows

set NODE_ENV=production
Run Code Online (Sandbox Code Playgroud)

Linux, macOS or other unix基于系统:

export NODE_ENV=production
Run Code Online (Sandbox Code Playgroud)

这会为当前 bash 会话设置 NODE_ENV,因此在此语句之后启动的任何应用程序都会将 NODE_ENV 设置为生产环境。

方法2NODE_ENV :为当前应用程序设置

NODE_ENV=production node app.js
Run Code Online (Sandbox Code Playgroud)

这将NODE_ENV仅针对当前应用程序进行设置。当我们想要在不同的环境中测试我们的应用程序时,这会很有帮助。

方法3:创建.env文件并使用它

这使用了这里解释的想法。请参阅这篇文章以获得更详细的解释。

基本上,您创建一个 .env 文件并运行一些 bash 脚本以在环境中设置它们。

为了避免编写 bash 脚本,可以使用 env-cmd 包加载 .env 文件中定义的环境变量。

env-cmd .env node app.js
Run Code Online (Sandbox Code Playgroud)

方法4:使用cross-env package

该包允许以一种方式为每个平台设置环境变量。

使用 npm 安装后,您只需将其添加到 package.json 中的部署脚本中即可,如下所示:

"build:deploy": "cross-env NODE_ENV=production webpack"
Run Code Online (Sandbox Code Playgroud)


小智 11

对于单个环境变量

 "scripts": {
    "start": "set NODE_ENV=production&& node server.js"
 }
Run Code Online (Sandbox Code Playgroud)

对于多个环境变量

 "scripts": {
    "start": "set NODE_ENV=production&& set PORT=8000&& node server.js"
 }
Run Code Online (Sandbox Code Playgroud)

  • 回答问题/有效,但可能不是最好的。假设您将 package.json 包含在存储库中,您最终可能会在版本控制存储库中包含 API 密钥等。 (2认同)

小智 10

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

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV && tagove help",
       "start": "set NODE_ENV=YOURENV && tagove start"
     }
    ...
  }
Run Code Online (Sandbox Code Playgroud)

  • @KennethSolberg 的评论是让它对我有用的最后一步(仅限 Windows) (3认同)
  • 我必须删除&&之前的空格。 (2认同)
  • 我也遇到了空间问题。当记录字符串长度时,我可以看出添加了空格。我尝试了转义引号 - 它们实际上存储在 envar 中。我尝试了其他分隔符但无济于事。删除空间或修剪值,这对我来说是错误的,是解决这个问题的唯一方法。 (2认同)

Ser*_*gey 9

这将在Windows 控制台中工作:

"scripts": {
  "setAndStart": "set TMP=test&& node index.js",
  "otherScriptCmd": "echo %TMP%"
}
Run Code Online (Sandbox Code Playgroud)

npm run aaa

输出: test

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

  • 应该是`set TMP=test&& npm run bbb`。`&&` 之前的空格也将作为 `NODE_ENV` 字符串的一部分 (7认同)

Fel*_*ura 9

@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"

Run Code Online (Sandbox Code Playgroud)

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

::: package.json :::

scripts: {
  "set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
  "storybook": "npm run set-env && start-storybook -s public"
}
Run Code Online (Sandbox Code Playgroud)

一些观察:

  • grep'ed cat 命令中的正则表达式将清除注释和空行。

  • &&不需要被“粘”npm run set-env,因为它会如果你在同一个命令设置的变量是必需的。

  • 如果您正在使用纱线,您可能会看到警告,您可以将其更改为yarn set-envnpm 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)",
}
Run Code Online (Sandbox Code Playgroud)

请记住,当您有密钥、密码或敏感/个人数据时,不要将 .env 文件添加到您的 git 存储库中!


KAR*_*ván 8

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

./.env 文件:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH
Run Code Online (Sandbox Code Playgroud)

./package.json

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 你如何在脚本中使用ENV1? (3认同)

yle*_*lev 8

使用多个环境变量从 package.json 运行 node.js 脚本:

  1. package.json 文件:

    "scripts": {
        "do-nothing": "set NODE_ENV=prod4 && set LOCAL_RUN=true && node ./x.js",
 },
Run Code Online (Sandbox Code Playgroud)

x.js 文件可以是:

let env     = process.env.NODE_ENV;
let isLocal = process.env.LOCAL_RUN;

console.log("ENV"    , env);
console.log("isLocal", isLocal);
Run Code Online (Sandbox Code Playgroud)


dev*_*raj 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*kin 7

更新:由于npm RFC 21,此解决方案可能会在 npm v7 中中断


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

您可以访问这些内部代码(例如process.env.npm_package_config_port在 JS 中),但它们已经可用于运行脚本的 shell,因此您也可以将它们作为$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/"
  } 
Run Code Online (Sandbox Code Playgroud)

这些“配置”字段的一个重要特性是用户可以在不修改 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
Run Code Online (Sandbox Code Playgroud)

请参阅npm configyarn config文档。
看来,纱读~/.npmrc这样npm config set既影响,但yarn config set写入~/.yarnrc,所以只有纱会看到它:-(

  • 请注意,自 NPM v7 起,[`$npm_package_*` 变量不再自动放置在环境中](https://github.com/npm/rfcs/issues/305),因此这可能会中断。 (2认同)

Shu*_*haw 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"
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

使用 dotenv 包来声明 env 变量


Cai*_*ean 6

{
  ...
  "scripts": {
    "start": "ENV NODE_ENV=production someapp --options"
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)


zdm*_*zdm 5

最优雅和便携的解决方案 package.json::

"scripts": {
    "serve": "export NODE_PRESERVE_SYMLINKS_MAIN=1 && vue-cli-service serve"
    },
Run Code Online (Sandbox Code Playgroud)

windows在创建下export.cmd并将其放在您的某处%PATH%

@echo off

set %*
Run Code Online (Sandbox Code Playgroud)