SwiftPM配置依赖后测试仍报框架模块未找到怎么办
Objective-C框架SPM迁移时测试目标报模块找不到的排查方案
问题现象
执行xcodebuild -scheme MyFramework -workspace .构建时,测试文件抛出如下错误:
/Users/uli/Programming/apple/MyFramework/MyFrameworkTests/MyFrameworkTests.m:4:9: module 'MyFramework' not found @import MyFramework; ~~~~~~~^~~~~~~~~~~~~~~
已确认Package.swift中testTarget配置了dependencies: ["MyFramework"]、测试与主框架同属一个SPM包时,按以下优先级排查:
- 优先校验主框架的公开头文件配置
SPM为OC框架自动生成模块映射的前提是能找到所有公开头文件,默认公开头文件目录为target根目录下的include文件夹:- 若公开头文件没有放在
include目录,必须在主框架target的声明中显式指定publicHeadersPath参数,填入公开头文件所在目录的相对路径 - 所有对外暴露的头文件必须放在
publicHeadersPath指向的目录内,且头文件的访问权限为Public,漏放头文件、头文件权限为Project/Private都会导致模块生成失败
- 若公开头文件没有放在
- 清理全量构建缓存排除缓存干扰
缓存脏数据是这类偶发模块识别错误的高频诱因,依次执行以下命令清理后重试构建:
如果是通过xcworkspace构建,清理完成后重新执行# 重置SPM包状态、清理本地构建缓存 swift package reset # 清空Xcode派生数据 rm -rf ~/Library/Developer/Xcode/DerivedData/*swift package generate-xcodeproj生成新的工程文件再打开构建。 - 显式配置测试目标的头文件搜索路径
纯OC测试目标偶尔会出现头文件搜索路径不自动继承的问题,直接在testTarget的cSettings中显式添加主框架公开头文件的相对搜索路径即可,示例配置:
注意路径必须是相对于测试target源码目录的相对路径,不要写本机绝对路径。.testTarget( name: "MyFrameworkTests", dependencies: ["MyFramework"], cSettings: [ .headerSearchPath("../MyFramework/include") // 替换为测试目录到主框架公开头目录的实际相对路径 ] ) - 校验模块名与构建设置一致性
- 检查主框架target是否自定义了
moduleName参数,若有自定义值,测试文件中import的模块名必须与自定义值完全一致(大小写敏感) - 检查是否自定义了主框架的cSettings覆盖了默认的
DEFINES_MODULE=1配置,若手动修改过构建设置,必须显式添加.define("DEFINES_MODULE", to: "1")到主框架的cSettings中,否则不会生成模块文件 - 确认测试.m文件的Target Membership仅勾选了测试target,没有被误加入其他同名target导致模块加载冲突
- 检查主框架target是否自定义了
内容的提问来源于stack exchange,提问作者uliwitness
相关产品推荐
相关产品推荐

