如何编写适配Mac与Windows的跨平台package.json脚本?
跨平台package.json脚本兼容解决方案
我之前也踩过这个跨平台脚本的坑!Mac和Windows的命令行差异(比如删除命令、环境变量设置、路径分隔符)确实很容易让npm脚本“水土不服”,给你几个亲测有效的解决思路:
1. 用跨平台工具包(最推荐)
直接用成熟的npm包来抹平系统差异,不用自己写复杂的条件判断:
- cross-env:处理环境变量设置,Windows里不能直接
NODE_ENV=production node xxx,用它就能跨平台统一写法 - rimraf:替代
rm -rf(Mac/Linux)和del/rd(Windows),一键删除文件/文件夹 - npm-run-all:方便并行或串行执行多个脚本,跨平台兼容命令拼接
示例配置
先安装依赖:
npm install cross-env rimraf npm-run-all --save-dev
然后在package.json里配置scripts:
{ "name": "my-cross-platform-app", "scripts": { "start": "cross-env NODE_ENV=development node server.js", "clean": "rimraf dist", "build": "npm-run-all clean build:js", "build:js": "babel src -d dist", "test": "cross-env NODE_ENV=test jest" }, "devDependencies": { "cross-env": "^7.0.3", "rimraf": "^5.0.5", "npm-run-all": "^4.1.5" } }
2. 利用npm内置变量做条件判断
如果不想额外装包,可以用npm的$npm_config_os变量判断当前系统,写分支命令:
{ "scripts": { "clean": "if [ \"$npm_config_os\" = \"win32\" ]; then rd /s /q dist; else rm -rf dist; fi" } }
⚠️ 注意:这种写法在Windows默认的cmd里可能不生效,需要用户用Git Bash或者WSL执行脚本,所以还是推荐第一种方法更稳妥。
3. 用Node.js脚本替代系统命令
如果有复杂的操作(比如批量文件处理),直接写个Node.js脚本,然后在scripts里调用:
比如写个clean.js:
const fs = require('fs').promises; const path = require('path'); async function cleanDist() { const distPath = path.join(__dirname, 'dist'); try { await fs.rm(distPath, { recursive: true, force: true }); console.log('Dist folder cleaned!'); } catch (err) { console.error('Clean failed:', err); } } cleanDist();
然后scripts里写:
{ "scripts": { "clean": "node clean.js" } }
这种方式完全跨平台,没有系统命令差异问题。
小技巧
- 路径尽量用正斜杠
/,npm脚本在Windows里会自动转成反斜杠\,避免手动写\\ - 避免用系统特定命令(比如
dir/ls),尽量用npm包或Node.js实现
内容的提问来源于stack exchange,提问作者Vah Run




