M2+芯片Mac设备上Lerna+React Native 0.76项目编译报错:ReactCodegen: Command PhaseScriptExecution failed with a nonzero exit code
我之前在M2 Mac上跑RN 0.76的Lerna项目时也踩过这个坑,codegen阶段的脚本错误确实挺头疼的。你已经试过了设置NODE_BINARY、清理Pods和Build文件夹这些基础操作,那我给你补充几个针对性的解决方案,亲测有效的那种:
锁定Node版本并统一依赖环境
虽然你用了v20和v22,但RN 0.76对Node 22的兼容性其实还没完全打磨好,建议优先切换到v20.x的LTS稳定版(比如v20.18.0)。用nvm的话,在项目根目录执行nvm use v20.18.0,然后删掉项目根目录和所有Lerna子包的node_modules、package-lock.json,重新跑npm install或者yarn install,避免依赖版本混乱。另外要确保Xcode能识别到nvm管理的Node路径,有时候Xcode会默认用系统Node,这就会导致路径不匹配。修复ReactCodegen脚本的权限与路径
进到iOS项目的Pods/ReactCodegen目录,先给生成脚本加执行权限:chmod +x generate-specs.sh。然后打开Xcode,找到Build Phases里的[CP-User] Generate Specs这个阶段,手动修改NODE_BINARY的绝对路径,比如改成你nvm下Node的实际路径:export NODE_BINARY="/Users/你的用户名/.nvm/versions/node/v20.18.0/bin/node",这样Xcode就能精准找到正确的Node执行文件了。清理深层缓存,避免残留冲突
除了常规的Pods和Build文件夹清理,还要多做两步:- 清理RN的全局缓存:
npx react-native clean - 清理Cocoapods的本地缓存:
pod cache clean --all
之后再重新pod install,很多时候深层缓存的残留会导致codegen生成的spec文件冲突。
- 清理RN的全局缓存:
调整Xcode的架构编译设置
M系列芯片是arm64架构,Xcode有时候会默认编译多架构导致冲突。打开Xcode,选中你的项目target,进入Build Settings:- 搜索
Excluded Architectures,把Debug和Release模式下的选项都设置为arm64(不要选x86_64) - 搜索
Build Active Architecture Only,设置为YES,让Xcode只编译当前设备的架构,减少codegen的负担。
- 搜索
统一Lerna子包的RN依赖
因为是monorepo结构,很容易出现子包和根项目RN版本不一致的情况。执行lerna clean清空所有子包的node_modules,然后用lerna bootstrap --hoist重新安装依赖,把RN相关的依赖统一提升到根目录,这样所有子包都会用同一个版本的RN,避免codegen生成的specs不兼容。
如果上面的方法都试过还是不行,你可以打开Xcode的Build Log,找到Generate Specs阶段的详细报错信息,里面会有更具体的错误提示(比如某个依赖的spec生成失败),顺着这个线索排查会更高效。
内容来源于stack exchange

