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

597
如何在package.json中设置一些环境变量,以便与类似于npm start的命令一起使用?
这是我当前在package.json中拥有的内容:
{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

我想在启动脚本中设置环境变量(例如NODE_ENV),但仍希望能够使用单个命令npm start启动应用程序。


4
您可以阅读此答案 https://dev59.com/KWEh5IYBdhLWcg3whT3S#57509175 - Daniel Danielecki
22个回答

11

针对单个环境变量

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

对于多个环境变量

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

2
回答问题/可行,但可能不是最佳方案。如果您在版本控制存储库中包含您的package.json,则可能会包括API密钥等信息。 - Dan.

10

突然我发现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或初始化脚本中设置环境变量的正确方法的人的答案,尤其是对于由其他人引导启动的应用程序。


10
在Windows中使用Git Bash。Git Bash处理命令的方式与cmd不同。
大多数Windows命令提示符在设置NODE_ENV = production这样的环境变量时都会出错。(例外情况是在Windows上使用Bash,该Bash使用本地Bash。)同样,在Windows和POSIX命令中利用环境变量的方法也有所不同。在POSIX中,您使用$ENV_VAR,在Windows中您使用%ENV_VAR%。-cross-env文档
{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

使用 dotenv 包来声明环境变量


7

如何在 package.json 中使用多个环境变量运行 node.js 脚本:

  1. package.json 文件:

    "scripts": {
        "do-nothing": "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);


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

5

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

"scripts": {
    "serve": "export NODE_PRESERVE_SYMLINKS_MAIN=1 && vue-cli-service serve"
    },

在Windows下创建export.cmd文件,并将其放置在你的%PATH%中。
@echo off

set %*

1
这很简单,但做得相当不错。 - JD Byrnes

4
如果你:
  • 目前使用Windows操作系统;
  • 已经安装了git bash;
  • 不想在package.json中使用 set ENV,因为这将导致它只能在Windows开发机上运行;
那么你可以将node的脚本shell从cmd设置为git bash,并在package.json中编写类似于Linux的环境设置语句,以便在Windows/Linux/Mac上都能正常工作。
$ npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

2
尽管并没有直接回答问题,但我想分享一个新的想法。从我的理解来看,每个方案都需要一定程度的复杂性才能实现跨平台独立性。
在我的情况下,我最初只想设置一个变量来控制是否使用JWT身份验证来保护服务器(用于开发目的)。
阅读了其他答案后,我决定简单地创建两个不同的文件,分别打开和关闭身份验证。
  "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
    }
}

也许这可以帮助其他人。

1
您不应该在package.json中设置ENV变量。 actionhero使用NODE_ENV允许您更改从./config中的文件加载的配置选项。请查看redis配置文件,了解如何使用NODE_ENV在NODE_ENV=test中更改数据库选项。
如果您想使用其他ENV变量来设置某些内容(例如HTTP端口),仍然不需要更改package.json中的任何内容。例如,如果您在ENV中设置PORT=1234并希望将其用作NODE_ENV=production中的HTTP端口,请在相关配置文件中引用它,即:
# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}

很好。我认为你没有读懂我的问题。我的问题是如何设置NODE_ENV,而不是它的用途。 - dev.meghraj
1
也许另一种解释方式是,NODE_ENV(以及其他环境变量)是环境的一部分(因此得名)。它们通常是服务器的属性,而不是应用程序的属性。您可以通过执行的命令手动设置它们,例如:NODE_ENV=test npm start,或者由 shell 设置。 - Evan
3
我不同意。为每个环境使用一个./config文件会限制你在部署应用程序时使用静态环境,这是一种过时的理念,无法在需要时创建新类型的环境。例如,如果你想要一个新的环境,就必须添加一个.config文件。在运行时设置环境变量可能是更灵活的选择,特别是当你的技术堆栈需要更多的灵活性时。我认为你的./config文件适用于设置“类型”环境,但如果你能在运行时定义诸如dsn字符串和api端点等内容,你的应用程序将更加灵活。 - Jesse Greathouse
@JesseGreathouse - 我有一个node.js应用程序,我需要在运行时设置环境变量 - 我应该在哪个文件中设置它们? - Roger Dodger

1
除了使用上面文档中记录的cross-env,在package.json的“run script”中设置一些环境变量外,如果您的脚本涉及运行NodeJS,则可以将Node设置为预先要求dotenv/config
{
  scripts: {
    "eg:js": "node -r dotenv/config your-script.js",
    "eg:ts": "ts-node -r dotenv/config your-script.ts",
    "test":  "ts-node -r dotenv/config -C 'console.log(process.env.PATH)'",
  }
}

这将使你的Node解释器引用dotenv/config,它会读取从调用Node的当前工作目录中的.env文件。

.env格式比较宽松或自由:

# Comments are permitted
FOO=123
BAR=${FOO}
BAZ=Basingstoke Round About

#Blank lines are no problem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接