You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写适配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

火山引擎 最新活动