添加自定义Configuration后TUIST下EventTracking模块无法编译测试
拆分大型单体项目为子模块时,为EventTracking框架编写测试,在import EventTracking前添加@testable宏会触发错误:"Module 'EventTracking' was not compiled for testing"。项目需适配多服务器,配置了多个自定义Configuration(如Develop-Debug、Stage-Debug等),EventTracking依赖的Internal_Framework_With_Helpers和Internal_Networking_Framework也配置了相同的自定义Configuration。所有项目可正常生成并构建,但测试时出现上述错误;移除EventTracking的自定义Configuration后测试可正常执行,但整个项目会出现大量构建错误。
以下是EventTracking的Project.swift代码:
let project = Project( name: "EventTracking", organizationName: "com.organizationName", options: .options( automaticSchemesOptions: Project.Options.AutomaticSchemesOptions.enabled( targetSchemesGrouping: .byNameSuffix( build: [ "", "Interface", "Testing" ], test: ["Tests"], run: [] ), codeCoverageEnabled: true, testingOptions: [] ) ), settings: .settings( base: [ "OTHER_LDFLAGS": "$(inherited) -ObjC" ], configurations: [ .debug(name: "Develop-Debug"), .debug(name: "Stage-Debug"), .debug(name: "Prod-Debug"), .debug(name: "Test1-Debug"), .debug(name: "Test2-Debug"), .debug(name: "Test3-Debug"), .debug(name: "Test4-Debug"), .release(name: "Develop-Release"), .release(name: "Stage-Release"), .release(name: "Prod-Release"), .release(name: "Test1-Release"), .release(name: "Test2-Release"), .release(name: "Test3-Release"), .release(name: "Test4-Release"), ], defaultSettings: .recommended ), targets: [ .target( name: "EventTracking", destinations: [ .iPhone, .macWithiPadDesign ], product: .framework, bundleId: "com.organizationName.EventTracking", deploymentTargets: DeploymentTargets.iOS("15.0"), sources: .paths( ["Sources/**/*.swift"] ), dependencies: [ TargetDependency.package( product: "AppsFlyerLib" ), TargetDependency.project( target: "Internal_Framework_With_Helpers", path: .relativeToRoot("Projects/Internal_Framework_With_Helpers") ), TargetDependency.project( target: "Internal_Networking_Framework", path: .relativeToRoot("Projects/Internal_Networking_Framework") ) ], settings: .settings( base: [ "DEVELOPMENT_ASSET_PATHS" : [""] ], configurations: [], defaultSettings: .recommended ) ), .target( name: "EventTrackingTests", destinations: [ .iPhone, .macWithiPadDesign ], product: .unitTests, bundleId: "com.organizationName.EventTrackingTests", deploymentTargets: DeploymentTargets.iOS("15.0"), sources: .paths( ["Tests/**/*.swift"] ), dependencies: [ TargetDependency.project( target: "EventTracking", path: .relativeToRoot("Projects/Data/EventTracking") ), TargetDependency.project( target: "Internal_TestingSupport_Framework", path: .relativeToRoot("Projects/Data/Internal_TestingSupport_Framework") ) ], settings: .settings( base: [ "DEVELOPMENT_ASSET_PATHS" : [""] ], configurations: [], defaultSettings: .recommended ) ) ], additionalFiles: [], resourceSynthesizers: [ .assets(), .files(extensions: ["json"]), ] )
这个错误的核心是测试目标与主框架的自定义Configuration未完全对齐:
- 主框架EventTracking定义了多套自定义Debug/Release Configuration,但测试目标EventTrackingTests的
configurations字段为空,默认仅使用标准的Debug/Release配置,两者配置不匹配。 - Xcode执行测试时,要求测试目标和被测目标使用完全一致的Configuration,否则无法找到带有
ENABLE_TESTABILITY=YES标记的框架编译产物,从而触发该错误。 - 依赖的Internal框架同样使用自定义Configuration,进一步放大了配置不匹配的问题。
要保留自定义Configuration同时让测试正常运行,需确保测试目标与主框架的配置完全对齐,具体步骤如下:
1. 为测试目标添加与主框架一致的自定义Configuration
修改EventTrackingTests的settings配置,添加和主框架完全相同的自定义Debug/Release Configuration:
.target( name: "EventTrackingTests", // 保留原有destinations、product、bundleId等配置 settings: .settings( base: [ "DEVELOPMENT_ASSET_PATHS" : [""] ], configurations: [ .debug(name: "Develop-Debug"), .debug(name: "Stage-Debug"), .debug(name: "Prod-Debug"), .debug(name: "Test1-Debug"), .debug(name: "Test2-Debug"), .debug(name: "Test3-Debug"), .debug(name: "Test4-Debug"), .release(name: "Develop-Release"), .release(name: "Stage-Release"), .release(name: "Prod-Release"), .release(name: "Test1-Release"), .release(name: "Test2-Release"), .release(name: "Test3-Release"), .release(name: "Test4-Release"), ], defaultSettings: .recommended ) )
2. 确保依赖的测试支持框架配置一致
确认Internal_TestingSupport_Framework也包含所有自定义Configuration,避免测试目标编译时出现依赖找不到的问题。
3. 验证Scheme的Configuration映射
检查自动生成的Scheme,确保测试阶段的Configuration与主框架当前使用的Configuration匹配:
- 打开Xcode的Scheme编辑器(
Product > Scheme > Edit Scheme) - 切换到Test标签,确认每个测试目标的Build Configuration和主框架的Configuration一一对应(如Develop-Debug对应Develop-Debug)
4. 强制开启Debug类配置的测试支持
在主框架的base settings中添加ENABLE_TESTABILITY = YES,确保所有Debug类型的自定义Configuration都开启测试支持:
settings: .settings( base: [ "OTHER_LDFLAGS": "$(inherited) -ObjC", "ENABLE_TESTABILITY": "YES" ], // 保留原有configurations和defaultSettings配置 )
内容的提问来源于stack exchange,提问作者kroumvud

