如何在package.json中判断是否使用Mac M1并按CPU架构条件执行脚本?
在package.json中根据Mac架构(M1/Intel)条件执行脚本
当然可以实现,核心思路是通过检测CPU架构标识来分支执行不同脚本,下面是两种实用方案:
方案1:直接用Shell命令判断(仅macOS)
macOS中,M1系列设备通过uname -m会返回arm64,Intel设备返回x86_64。你可以在package.json的脚本里直接写Shell条件判断:
{ "scripts": { "start": "if [ \"$(uname -m)\" = \"arm64\" ]; then npm run start-m1; else npm run start-intel; fi", "start-m1": "echo '执行M1专属脚本逻辑'", "start-intel": "echo '执行Intel专属脚本逻辑'" } }
- 运行
npm run start时,会自动根据当前设备架构调用对应的子脚本 - 注意引号转义:JSON里的双引号需要用
\转义,避免语法错误
方案2:用Node.js脚本做判断(更灵活)
如果需要跨平台兼容或者更复杂的逻辑,可以写一个简单的Node.js脚本作为入口:
- 新建
arch-check.js文件:
const { arch } = process; const { spawnSync } = require('child_process'); // 判断架构并执行对应脚本 if (arch === 'arm64') { spawnSync('npm', ['run', 'start-m1'], { stdio: 'inherit' }); } else if (arch === 'x64') { spawnSync('npm', ['run', 'start-intel'], { stdio: 'inherit' }); } else { console.error('当前设备架构不支持'); }
- 在package.json中配置脚本:
{ "scripts": { "start": "node arch-check.js", "start-m1": "your-m1-specific-command", "start-intel": "your-intel-specific-command" } }
process.arch在原生arm64的Node环境下返回arm64,Rosetta转译的x64 Node环境下返回x64,能准确区分实际运行环境
注意事项
- 如果你的Node是通过Rosetta安装的x64版本,即使是M1设备,
process.arch也会返回x64,这种情况下可以用sysctl -n machdep.cpu.brand_string检测CPU型号(比如包含Apple字样就是M1),但一般原生arm64 Node是更推荐的安装方式 - 两种方案都可以扩展到其他架构的判断,比如Windows的x64等
内容的提问来源于stack exchange,提问作者sina farbod
相关产品推荐
相关产品推荐

