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

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

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

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


当前回答

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

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

其他回答

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

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

:::包。json:::

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

一些观察:

grep'ed cat命令中的正则表达式将清除注释和空行。 &&不需要“粘”到npm run set-env上,因为如果你在同一个命令中设置变量,就需要这样做。 如果你正在使用yarn,你可能会看到一个警告,你可以把它改成yarn set-env,或者用npm run set-env——scripts- prepending -node-path &&代替。

不同的环境

使用它的另一个优点是可以使用不同的环境变量。

scripts: {
  "set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
  "set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}

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

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

在我的场景中,最初我只想设置一个变量来控制是否使用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.js脚本。带有多个环境变量的Json:

包中。json文件:

"脚本":{ "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);

如果你:

目前正在使用Windows; 安装git bash; 不要在包中使用set ENV。json,这使得它只能在Windows开发机器上运行;

然后将node的脚本shell从cmd设置为git bash,并在package中编写linux风格的env设置语句。json使它能够在Windows/Linux/Mac上工作。

$ npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

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