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

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

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

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


当前回答

这将在Windows控制台工作:

"scripts": {
  "setAndStart": "set TMP=test&& node index.js",
  "otherScriptCmd": "echo %TMP%"
}

运行aaa

输出: 测验

详情请看这个答案。

其他回答

突然我发现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脚本,这些都是由别人引导的。

我只是想在这里为未来的node探索者补充我的意见。在我的Ubuntu 14.04上,NODE_ENV=测试不起作用,我不得不使用export NODE_ENV=test,之后NODE_ENV=test也开始工作了,很奇怪。

在Windows上,正如前面所说,你必须使用set NODE_ENV=test,但对于跨平台解决方案,cross-env库似乎没有做到这一点,你真的需要一个库来做到这一点吗:

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

垂直条是需要的,否则Windows会在无法识别的导出NODE_ENV命令时崩溃。我不知道后面的空格,但为了确保我把它们也去掉了。

注意:为了设置多个环境变量,脚本应该是这样的

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

除了使用上面描述的cross-env,在包中设置一些环境变量。如果你的脚本涉及运行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)'",
  }
}

这将导致您的节点解释器需要dotenv/config,它将自己读取当前工作目录中调用节点的.env文件。

.env格式是宽松的或自由的:

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

#Blank lines are no problem

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

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

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

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

这些文件只是调用原始index.js文件的包装器(我将其重命名为appbootstrap .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
    }
}

也许这能帮助到其他人