如何正确集成两个.swiftmodule,解决Xcode iOS构建多命令生成冲突问题
Swift静态库多.swiftmodule文件冲突解决方案
问题背景
项目集成带内部依赖的静态库时,项目结构如下:
lib目录下存在两个分别对应内部依赖库的.swiftmodule目录:Lib.swiftmodule、IOSStatic.swiftmodule,编译时触发如下路径冲突报错:
Multiple commands produce '/Users//Library/Developer/Xcode/DerivedData/TestProject-evoarbsjaphalweicycrw/Build/Products/Debug-iphoneos/TestProject.app/arm64-apple-ios.swiftsourceinfo': 1) Target 'TestProject' (project 'TestProject') has copy command from '/Users//Buffer/iOS_projects/TestProject/TestProject/lib/Lib.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo' to '/Users//Library/Developer/Xcode/DerivedData/TestProject-evoarbsjaphalweicycrw/Build/Products/Debug-iphoneos/TestProject.app/arm64-apple-ios.swiftsourceinfo' 2) Target 'TestProject' (project 'TestProject') has copy command from '/Users//Buffer/iOS_projects/TestProject/TestProject/lib/IOSStatic.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo' to '/Users//Library/Developer/Xcode/DerivedData/TestProject-evoarbsjaphalweicycrw/Build/Products/Debug-iphoneos/TestProject.app/arm64-apple-ios.swiftsourceinfo'
核心原因
.swiftmodule属于Swift模块的编译索引文件,不属于App资源文件。你错误将两个.swiftmodule目录加入到了主Target的Copy Bundle Resources构建阶段,Xcode会把两个目录下同名的架构相关.swiftsourceinfo文件拷贝到App包的同一路径,触发路径冲突。
解决方案
方案1(推荐):调整.swiftmodule的搜索路径配置,移除资源拷贝
- 打开Xcode项目,选中主Target,切换到Build Phases标签页
- 找到Copy Bundle Resources列表,删除
Lib.swiftmodule、IOSStatic.swiftmodule两个条目 - 切换到Build Settings标签页,找到
Swift Compiler - Search Paths分组下的Import Paths配置项 - 添加你的lib目录路径,示例:
$(SRCROOT)/TestProject/lib,若层级较深可勾选递归选项
该方案既保证Xcode编译时能正常识别两个内部依赖的Swift模块,又不会将模块索引文件拷贝到最终App包内,从根源避免路径冲突。
方案2:清理.swiftsourceinfo文件
如果你需要保留.swiftmodule在资源目录的配置,可以手动删除两个.swiftmodule目录下的*.swiftsourceinfo文件:
- 该文件属于调试用的源码映射信息,仅在源码调试静态库时需要,发布集成时删除不影响功能
- 删除后两个.swiftmodule目录下不存在同名冲突文件,即可正常编译
验证操作
配置完成后,清空Xcode的DerivedData缓存,重新编译项目即可解决报错。
内容的提问来源于stack exchange,提问作者Sirop4ik
相关产品推荐
相关产品推荐

