React Native 0.62升级0.68 iOS新架构构建PhaseScriptExecution报错求助
PhaseScriptExecution failed with a nonzero exit code (FBReactNativeSpec.build/Script-46EB2E00014D80.sh)是0.68版本新架构适配的典型报错,跨大版本升级、甚至新建项目触发该问题,本质都是缓存残留、配置错配、环境不兼容三类原因,按以下步骤逐次操作即可解决,不要跳步:
第一步:全链路清理残留缓存
完全退出Xcode、关闭所有Metro及终端进程后,在项目根目录依次执行以下命令:watchman watch-del-all rm -rf node_modules && yarn install rm -rf ~/Library/Developer/Xcode/DerivedData/* cd ios rm -rf Pods Podfile.lock build pod deintegrate从0.62及以下版本升级的项目会残留大量老架构的编译缓存,跳过这步后续所有配置都不会生效。
第二步:修正Podfile配置(90%的报错源于这步配置错误)
打开ios目录下的Podfile,逐行核对以下配置:- 文件最顶部全局声明新架构开关,注意0.68版本需要同时兼容两个环境变量标记,不要只抄最新版文档的单开关配置:
ENV['USE_NEW_ARCH'] = '1' use_react_native!配置块中必须显式传入以下参数,不要留默认值:use_react_native!( :path => config[:reactNativePath], :hermes_enabled => true, :fabric_enabled => true, :app_path => "#{Pod::Config.instance.installation_root}/.." )- 删除所有0.62版本时期手动添加的
FBReactNativeSpec、RCTRequired、RCTTypeSafety等单独pod引用,新架构下这些依赖会由Codegen脚本自动引入,手动添加会触发符号冲突导致脚本执行失败。
- 文件最顶部全局声明新架构开关,注意0.68版本需要同时兼容两个环境变量标记,不要只抄最新版文档的单开关配置:
第三步:带环境变量重新安装Pod依赖
在ios目录下执行安装命令,不要省略前缀的环境变量声明:RCT_NEW_ARCH_ENABLED=1 USE_NEW_ARCH=1 pod install安装完成后检查控制台输出,必须出现
Installing React-Codegen、Generating FBReactNativeSpec codegen artifacts相关日志,如果没有输出这部分内容,回到上一步检查Podfile配置。第四步:校验构建环境版本
0.68版本的新架构仅兼容Xcode 13.3~13.4版本,使用Xcode 14及以上版本编译时,自带的Clang版本与0.68依赖的Folly版本不兼容,会直接导致Codegen脚本执行失败,这也是新建空白项目开启新架构无法运行的核心原因,必须切换到对应版本的Xcode后再执行构建。
切换Xcode版本后执行sudo xcode-select -s /Applications/Xcode13.app/Contents/Developer(路径替换为你本地Xcode13的实际路径),再执行一次pod install。第五步:首次构建注意事项
不要直接用Xcode的Run按钮启动,先在项目根目录执行yarn ios触发首次构建,第一次构建会自动生成所有Codegen相关的桥接代码,耗时比老架构长3~5分钟,不要中途中断,中断后必须回到第一步重新清理缓存再重试。
构建前检查项目Build Settings中的Other Linker Flags项,确认存在$(inherited)值,且能看到自动生成的-lreact_codegen_rncore参数,缺失该参数说明Pod依赖未正确安装。
额外注意:从0.62版本升级的项目,需要暂时移除所有不支持新架构的手动链接第三方原生库,这类库的存在也会导致Codegen脚本执行阶段抛出异常,等项目基础壳工程能正常运行后,再逐个适配第三方库的新架构版本。
内容的提问来源于stack exchange,提问作者Madhu

