如何精确定位React-Native构建阶段脚本的报错位置
Xcode构建React Native脚本报错排查步骤
开启详细构建日志,拿到完整错误信息
你之前加的echo看不到输出,90%的原因是Xcode默认折叠了构建脚本的输出,且默认日志等级不会打印普通调试内容,先按下面的配置开全量日志:
- 打开Xcode项目,点击顶部菜单栏
Product->Scheme->Edit Scheme - 左侧栏选中
Build项,右侧匹配你当前的构建配置(一般是Debug),找到Build Options分类下的Verbose Build Log选项打勾 - 重新触发构建,报错后在左侧问题导航栏(三角感叹号图标)选中最顶部的红色错误条目,右侧日志区找到
Command PhaseScriptExecution failed with a nonzero exit code这行通用报错,点击行尾的展开按钮,把所有折叠的日志段全部拉开 - 直接在展开的日志里搜索
error:、fatal:、Command failed关键词,抛出非零退出码之前的3-10行内容就是具体的错误原因,不要只看最后一行的通用报错提示
精确定位报错脚本的具体位置
- 在刚才展开的全量日志里,找到报错段最开头的
PhaseScriptExecution行,这行后面会明确标注当前执行的构建脚本名称、本地存储路径,React Native 0.68版本常见的报错脚本集中在[CP-User] [RN] Generate Specs、Bundle React Native code and images两个构建阶段 - 拿到路径后直接打开对应文件排查,不要盲目在node_modules目录下随便加打印:如果是CocoaPods自动生成的脚本,路径一般在
ios/Pods/Target Support Files/对应项目target的目录下;如果是项目自定义的构建脚本,直接在Xcode项目配置的Build Phases标签页,找到对应名称的脚本段就能看到完整源码
正确添加调试打印的方法
- 先确认你修改的文件是上一步查到的、构建流程实际加载执行的脚本,改到未被引用的文件上自然不会有输出
- 加打印的时候不要只用普通
echo,把输出重定向到stderr就能避免被Xcode折叠,写法参考:echo "调试标记:当前执行到节点xxx,变量值为$xxx" >&2 - 需要定位具体报错行的话,直接在你怀疑的代码段前加一行
set -x,shell会自动打印每一行待执行的命令、参数、返回结果,执行到报错行就会直接停住,能精准定位出错位置,调试完成后删掉这行即可
React Native 0.68版本这类报错的常见快速排查方向
- 如果定位到是
Generate Specs阶段报错,先回到项目根目录执行包管理器安装命令(yarn install/npm install)确认依赖完整,再进入ios目录执行pod install --repo-update重新生成CocoaPods配置后再构建 - 如果定位到是JS打包阶段报错,直接在项目根目录单独执行打包命令:
npx react-native bundle --platform ios --dev false --entry-file index.js --bundle-output ./test-output.bundle,终端会直接打印JS侧的具体报错,比Xcode日志的可读性高很多
内容的提问来源于stack exchange,提问作者JSharles
相关产品推荐
相关产品推荐

