Skip to content

package.json 跨平台脚本配置

在一个 package.json 中处理 Windows 和 Linux 的不同命令。

场景

Windows 用 rmdir /s /q 删除目录,Linux 用 rm -rf。怎么在一个 package.json 里支持两个平台?

方案一:条件执行 (推荐)

利用 Node.js 的 process.platform 判断操作系统:

json
{
  "scripts": {
    "clean:win": "rmdir /s /q build",
    "clean:unix": "rm -rf build",
    "clean": "node -e \"require('child_process').execSync(process.platform === 'win32' ? 'npm run clean:win' : 'npm run clean:unix', { stdio: 'inherit' })\""
  }
}

或者用更简洁的方式:

json
{
  "scripts": {
    "clean": "node -e \"const{execSync}=require('child_process');execSync(process.platform==='win32'?'rmdir /s /q build':'rm -rf build',{stdio:'inherit'})\""
  }
}

方案二:使用 cross-env + shx

bash
npm install -D cross-env shx
json
{
  "scripts": {
    "clean": "shx rm -rf build",
    "build": "cross-env NODE_ENV=production webpack"
  }
}
  • cross-env:统一设置环境变量,抹平 Windows/Linux 差异
  • shx:在 npm scripts 中使用 Unix-like 命令,跨平台兼容

方案三:使用 rimraf

专门用于跨平台删除的 npm 包:

bash
npm install -D rimraf
json
{
  "scripts": {
    "clean": "rimraf build"
  }
}

其他常见的跨平台命令对照

操作LinuxWindows (cmd)跨平台方案
删除目录rm -rf buildrmdir /s /q buildrimraf build
复制文件cp -r src distxcopy /E src distshx cp -r src dist
创建目录mkdir -p distmkdir distshx mkdir -p dist
环境变量NODE_ENV=prodset NODE_ENV=prodcross-env NODE_ENV=prod