使用Tuist搭建多模块iOS应用时遇Sentry重复定义编译错误
问题
使用Tuist搭建多模块iOS应用时,编译出现重复定义错误,例如:
[REDACTED]/Tuist/Dependencies/SwiftPackageManager/.build/checkouts/sentry-cocoa/Sources/Sentry/Public/SentryDefines.h:104:28 Redefinition of 'SentryLogLevel'
已尝试调整构建设置、清理拉取依赖,参考Tuist Issue#4688配置后仍无效。以下是当前的配置文件:
Dependencies.swift
var swiftPackageManagerDependencies = SwiftPackageManagerDependencies([ .remote( url: "https://github.com/getsentry/sentry-cocoa.git", requirement: .upToNextMajor(from: "8.19.0") ), .remote( url: "https://github.com/Alamofire/Alamofire.git", requirement: .upToNextMajor(from: "5.8.1") ), .remote( url: "https://github.com/auth0/Auth0.swift", requirement: .upToNextMajor(from: "2.5.0") ), .remote( url: "https://github.com/firebase/firebase-ios-sdk.git", requirement: .upToNextMajor(from: "10.20.0") ) ] ) let dependencies = Dependencies( swiftPackageManager: swiftPackageManagerDependencies, platforms: [.iOS] )
Project.swift
import ProjectDescription import ProjectDescriptionHelpers let projectSettings: Settings = .settings( base: [ "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER": "NO", "CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES": "YES", "OTHER_SWIFT_FLAGS": "-Xcc -Wno-error=non-modular-include-in-framework-module" ] ) let targetSettings: Settings = .settings( base: [ "USE_HEADERMAP": "YES", "OTHER_LDFLAGS": "-ObjC", "HEADER_SEARCH_PATHS": ["$(inherited)", "Tuist/Dependencies/SwiftPackageManager/.build/checkouts/sentry-cocoa/Sources/Sentry/**"] ] ) let project = Project( name: "CoreData", // settings: projectSettings, targets: [ Target( name: "CoreData", destinations: .iOS, product: .framework, bundleId: "domain.coredata", sources: ["Sources/**"], resources: ["Resources/**"], dependencies: [ .external(name: "Alamofire", condition: nil), .external(name: "Auth0", condition: nil), .external(name: "FirebaseMessaging", condition: nil), .external(name: "Sentry", condition: nil) ], settings: targetSettings ), Target( name: "CoreDatatests", destinations: .iOS, product: .unitTests, bundleId: "domain.coredata.tests", sources: ["Tests/**"], resources: ["Resources/**"], dependencies: [ .target(name: "CoreData", condition: .none) ] ) ] )
解决方案
问题根源
你在targetSettings里手动添加了Sentry的头文件搜索路径,而Tuist通过SPM管理依赖时已经自动处理了框架的头文件引入,这导致编译器两次读取Sentry的头文件,触发重复定义错误。
修复步骤
移除手动添加的头文件搜索路径
修改targetSettings中的HEADER_SEARCH_PATHS,删除指向Sentry本地路径的配置,只保留$(inherited):let targetSettings: Settings = .settings( base: [ "USE_HEADERMAP": "YES", "OTHER_LDFLAGS": "-ObjC", "HEADER_SEARCH_PATHS": ["$(inherited)"] ] )启用项目级基础设置(可选但推荐)
取消注释Project中的settings: projectSettings,让项目级的模块化配置生效,避免后续其他依赖出现类似问题:let project = Project( name: "CoreData", settings: projectSettings, // 取消注释这一行 targets: [ // ... 原有target配置 ] )清理缓存并重新生成项目
执行以下命令清除旧的构建缓存和生成文件,确保新配置生效:tuist clean && tuist generate
修改后的完整Project.swift
import ProjectDescription import ProjectDescriptionHelpers let projectSettings: Settings = .settings( base: [ "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER": "NO", "CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES": "YES", "OTHER_SWIFT_FLAGS": "-Xcc -Wno-error=non-modular-include-in-framework-module" ] ) let targetSettings: Settings = .settings( base: [ "USE_HEADERMAP": "YES", "OTHER_LDFLAGS": "-ObjC", "HEADER_SEARCH_PATHS": ["$(inherited)"] ] ) let project = Project( name: "CoreData", settings: projectSettings, targets: [ Target( name: "CoreData", destinations: .iOS, product: .framework, bundleId: "domain.coredata", sources: ["Sources/**"], resources: ["Resources/**"], dependencies: [ .external(name: "Alamofire", condition: nil), .external(name: "Auth0", condition: nil), .external(name: "FirebaseMessaging", condition: nil), .external(name: "Sentry", condition: nil) ], settings: targetSettings ), Target( name: "CoreDatatests", destinations: .iOS, product: .unitTests, bundleId: "domain.coredata.tests", sources: ["Tests/**"], resources: ["Resources/**"], dependencies: [ .target(name: "CoreData", condition: .none) ] ) ] )
内容的提问来源于stack exchange,提问作者Cate Daniel
相关产品推荐
相关产品推荐

