react-native run-ios 安装Pods后仅首次成功,后续报错如何解决
修复 react-native run-ios 二次构建失败的配置方案
核心原因
- 集成CocoaPods后,所有Pods依赖的链接规则、Framework搜索路径都挂载在
.xcworkspace的构建层级,RN 0.59版本的react-native run-ios默认指向.xcodeproj入口发起构建,无法加载这些Pod配置,因此会出现二次构建直接报65错误、找不到-lDoubleConversion库的问题。 - RN 0.59版本的CLI不会自动检测项目下的
.xcworkspace文件,必须手动显式指定构建入口,才能避免走错误的.xcodeproj路径。
具体配置步骤
强制CLI走正确的构建入口
不要直接执行不带参数的react-native run-ios,需要补充两个必填参数,强制指定workspace和对应的scheme:react-native run-ios --workspace ios/你的项目名.xcworkspace --scheme 你的target名称参数替换说明:
--workspace路径填写iOS目录下通过pod install生成的.xcworkspace文件路径,绝对不能指向.xcodeproj--scheme填写和Xcode打开workspace后顶部显示的构建scheme完全一致的名称,和Podfile里声明的主target名称匹配
修正Podfile的不兼容配置
当前Podfile开启的use_frameworks!动态框架模式,和RN 0.59自带的静态依赖(React、yoga、第三方native模块)兼容性极差,极易出现链接异常,需要做两点调整:- 注释掉
use_frameworks!行,切回CocoaPods默认的静态库链接模式(这也是RN 0.59官方原生集成的默认配置) - 删除Podfile里手动声明的
DoubleConversion、glog、Folly三个pod,这三个依赖已经被React的subspec自动关联引入,手动重复声明会触发版本不匹配问题
调整后主target的核心配置参考:
target 'myapp' do # 注释掉动态框架配置,保持静态库兼容 # use_frameworks! pod 'RNDateTimePicker', :path => '../node_modules/@react-native-community/datetimepicker/RNDateTimePicker.podspec' pod 'React', :path => '../node_modules/react-native', :subspecs => [ 'Core', 'CxxBridge', 'DevSupport', 'RCTText', 'RCTNetwork', 'RCTWebSocket', ] pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga' # 此处删除手动引入的三个第三方pod,由React subspec自动加载 target 'myapp-tvOSTests' do inherit! :search_paths end target 'myappTests' do inherit! :search_paths end end调整完成后在iOS目录下执行
pod install,重新生成workspace配置。- 注释掉
清理历史缓存消除构建冲突
之前第一次能跑、第二次失败的问题,大多是因为.xcodeproj构建残留的缓存和workspace的构建产物路径冲突,需要执行一次全量缓存清理:# 先cd到iOS目录下执行 rm -rf ~/Library/Developer/Xcode/DerivedData/ rm -rf build/ pod deintegrate pod install清理完成后,不需要再手动在Xcode里修改任何构建设置,执行带参数的
react-native run-ios即可正常启动。简化日常操作(可选)
不想每次手动输入长参数的话,可以在项目根目录的package.json的scripts块里加一行自定义脚本,把固定参数封装好:"scripts": { "ios": "react-native run-ios --workspace ios/MyApp.xcworkspace --scheme myapp" }后续开发只需要执行
npm run ios,就能直接触发完整的构建启动流程,不需要手动操作Xcode。
内容的提问来源于stack exchange,提问作者Ville Miekk-oja
相关产品推荐
相关产品推荐

