Xcode构建通用iOS Framework时报build.db磁盘I/O错误如何解决
报错原因
该磁盘I/O错误由Xcode新型构建系统的资源冲突导致:你脚本中串行执行了模拟器、真机两次xcodebuild构建任务,两个任务会争抢访问同一份构建数据库/Build/Intermediates.noindex/XCBuildData/build.db,读写冲突触发报错。
修复方案
- 方案1:给xcodebuild指令添加独立派生数据路径参数,避免共享构建数据库
修改脚本中两个xcodebuild构建指令,分别给每个构建任务指定独立的派生数据存储目录,规避路径参数为-derivedDataPath "./DerivedData_${SDK_NAME}",修改后的构建指令示例如下:
# 模拟器构建指令修改 xcodebuild BITCODE_GENERATION_MODE=bitcode -workspace "${PROJECTNAME}.xcworkspace" -scheme "${PROJECTNAME}" -sdk iphonesimulator -configuration "${CONFIGURATION}" clean build CONFIGURATION_BUILD_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" -derivedDataPath "./DerivedData_Simulator" 2>&1 # 真机构建指令修改 xcodebuild BITCODE_GENERATION_MODE=bitcode -workspace "${PROJECTNAME}.xcworkspace" -scheme "${PROJECTNAME}" -sdk iphoneos -configuration "${CONFIGURATION}" clean build CONFIGURATION_BUILD_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneos" -derivedDataPath "./DerivedData_iOS" 2>&1
方案2:强制使用旧版构建系统
在所有xcodebuild指令末尾添加-UseModernBuildSystem=NO参数,强制使用兼容度更高的旧版构建系统,构建过程不会生成共享的build.db文件,从根源避免冲突。方案3:清理残留构建缓存
完全退出Xcode后,执行以下命令清理全局Xcode缓存后重新构建:
rm -rf ~/Library/Developer/Xcode/DerivedData rm -rf ~/Library/Caches/com.apple.dt.Xcode
- 方案4:替换为XCFramework构建方案(推荐)
Xcode 11及以上版本支持直接构建XCFramework格式的通用包,无需手动合并模拟器和真机架构,完全规避上述构建冲突问题。
完整修改后脚本参考
###################### # Options ###################### REVEAL_ARCHIVE_IN_FINDER=true FRAMEWORK_NAME="XXXX" SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework" DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework" UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal" FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework" PROJECTNAME="XXXX" ###################### # Clean ###################### xcodebuild clean -workspace "${PROJECTNAME}.xcworkspace" -scheme "${PROJECTNAME}" ###################### # Build Frameworks ###################### # 新增独立派生数据路径参数 xcodebuild BITCODE_GENERATION_MODE=bitcode -workspace "${PROJECTNAME}.xcworkspace" -scheme "${PROJECTNAME}" -sdk iphonesimulator -configuration "${CONFIGURATION}" clean build CONFIGURATION_BUILD_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" -derivedDataPath "./DerivedData_Simulator" 2>&1 xcodebuild BITCODE_GENERATION_MODE=bitcode -workspace "${PROJECTNAME}.xcworkspace" -scheme "${PROJECTNAME}" -sdk iphoneos -configuration "${CONFIGURATION}" clean build CONFIGURATION_BUILD_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneos" -derivedDataPath "./DerivedData_iOS" 2>&1 ###################### # Create directory for universal ###################### rm -rf "${UNIVERSAL_LIBRARY_DIR}" mkdir "${UNIVERSAL_LIBRARY_DIR}" mkdir "${FRAMEWORK}" ###################### # Copy files Framework ###################### cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}" # 如需生成完整通用Framework需要补充lipo合并模拟器、真机二进制架构的代码
内容的提问来源于stack exchange,提问作者HariKarthick
相关产品推荐
相关产品推荐

