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

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

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

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


当前回答

在windows中使用git bash。Git Bash处理命令的方式与cmd不同。

当您像这样使用NODE_ENV=production设置环境变量时,大多数Windows命令提示符都会阻塞。(Windows上的Bash是个例外,它使用原生Bash。)类似地,窗口和POSIX命令利用环境变量的方式也有所不同。对于POSIX,您使用:$ENV_VAR,在windows上使用%ENV_VAR%。-交叉环境文件

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

使用dotenv包来声明env变量

其他回答

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

在我的场景中,最初我只想设置一个变量来控制是否使用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
    }
}

也许这能帮助到其他人

当NODE_ENV环境变量被设置为“production”时,包中的所有devDependencies。当运行NPM install时,Json文件将被完全忽略。你也可以使用——production标志来强制执行:

npm install --production

要设置NODE_ENV,您可以使用这些方法中的任何一种

方法一:为所有节点应用设置NODE_ENV

窗口:

set NODE_ENV=production

Linux、macOS或其他基于unix的系统:

export NODE_ENV=production

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

方法2:设置当前应用的NODE_ENV

NODE_ENV=production node app.js

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

方法三:创建。env文件并使用

这使用了这里解释的想法。请参考这篇文章了解更详细的解释。

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

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

env-cmd .env node app.js

方法四:使用跨环境包

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

在用npm安装它之后,你可以把它添加到你的部署脚本中。Json格式如下:

"build:deploy": "cross-env NODE_ENV=production webpack"

你不应该在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
      }
    }
  }
}

我只是想在这里为未来的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命令时崩溃。我不知道后面的空格,但为了确保我把它们也去掉了。

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