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

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

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

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


当前回答

我只是想在这里为未来的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&& node server.js"
 }

对于多个环境变量

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

在Windows上尝试替换YOURENV:

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

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

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

警告:不知道这是否适用于纱线


NPM(和yarn)从包中传递大量数据。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上不起作用?)

“config”部分似乎是用于此用途的:

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

这些“config”字段的一个重要特性是用户可以在不修改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配置和yarn配置文档。 看起来yarn的读音是~/。NPMRC,所以NPM配置集影响两者,但yarn配置集写入~/。Yarnrc,所以只有纱线才能看到它:-(

这将在Windows控制台工作:

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

运行aaa

输出: 测验

详情请看这个答案。