在 windows cmd 中使用带有 if 条件的 $NODE_ENV

To use $NODE_ENV with if condition in windows cmd

"scripts": {
  "start": "if [[ $NODE_ENV == 'production' ]]; then node ./bin/www; else nodemon ./bin/www; fi"
},

上面的代码在 Unix 终端中使用,我想在 windows cmd.

中使用相同的代码

但是当我尝试这样做时,我得到 NODE_ENV was unexpected at this time.

我想要一个可以在 windows cmd.

中执行的正确代码

考虑以下跨平台解决方案,无论 shell 是 cmd (windows) 还是 sh (*nix)。它基本上利用 node.js 复制相同的条件逻辑并 shell 出适当的命令。

"scripts": {
  "start": "node -e \"const cmd = process.env.NODE_ENV === 'production' ? 'node' : 'nodemon'; require('child_process').execSync(cmd + ' ./bin/www', { stdio: [0,1,2] });\""
}

解释:

start npm 脚本执行以下操作:

  1. 利用 node.js 命令行选项 -e 计算内联 JavaScript.

  2. 使用conditional (ternary) operator,即读取的部分:

    const cmd = process.env.NODE_ENV === 'production' ? 'node' : 'nodemon'
    
    • 我们利用process.env属性检查NODE_ENV环境变量的值。

    • 如果 NODE_ENV 环境变量的值等于 production 我们将 node 命令分配给 cmd 变量。否则我们分配 nodemon 命令。

  3. 在读到的部分:

    require('child_process').execSync(cmd + ' ./bin/www', { stdio: [0,1,2] });
    
    • 我们 require the builtin execSync() 来自 child_process 模块的方法。
    • 然后我们根据在第 2 点(上面)获得的内容执行 node ./bin/wwwnodemon ./bin/www 命令。
    • stdio 部分为子进程中的 stdin、stdout、stderr 配置管道。