在 Windows cmd 中使用 $NODE_ENV 和 if 条件

Posted

技术标签:

【中文标题】在 Windows cmd 中使用 $NODE_ENV 和 if 条件【英文标题】:To use $NODE_ENV with if condition in windows cmd 【发布时间】:2020-11-06 10:17:37 【问题描述】:
"scripts": 
  "start": "if [[ $NODE_ENV == 'production' ]]; then node ./bin/www; else nodemon ./bin/www; fi"
,

上面的代码用于Unix终端,我想在windowscmd中使用。

但是当我尝试这样做时,我得到了NODE_ENV,这在当时是出乎意料的。

我想要一个可以在 windows cmd 中执行的正确代码。

【问题讨论】:

【参考方案1】:

考虑以下跨平台解决方案,无论外壳是cmd (windows) 还是sh (*nix),它都能成功运行。它本质上是利用 node.js 来复制相同的条件逻辑并输出适当的命令。

"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 脚本执行以下操作:

    利用 node.js 命令行选项 -e 来评估内联 javascript

    使用conditional (ternary) operator,即写成的部分:

    const cmd = process.env.NODE_ENV === 'production' ? 'node' : 'nodemon'
    

    我们利用process.env 属性来检查NODE_ENV 环境变量的值。

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

    部分内容如下:

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

【讨论】:

以上是关于在 Windows cmd 中使用 $NODE_ENV 和 if 条件的主要内容,如果未能解决你的问题,请参考以下文章

Windows中使用cmd对系统硬盘进行分区

如何使用命令提示符 (cmd) 在 Windows 中列出文件。我尝试在 Linux 中使用“ls”,但它显示错误? [关闭]

Windows 在CMD 终端中使用SS代理

Windows中使用cmd判断硬盘是HDD(机械硬盘)还是SSD(固态硬盘)

windows下使用cmd重命名文件名

在 .cmd 中使用 Windows 命令测试是 32 位还是 64 位并运行命令