You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的头文件,触发重复定义错误。

修复步骤

  1. 移除手动添加的头文件搜索路径
    修改targetSettings中的HEADER_SEARCH_PATHS,删除指向Sentry本地路径的配置,只保留$(inherited):

    let targetSettings: Settings = .settings(
        base: [
            "USE_HEADERMAP": "YES",
            "OTHER_LDFLAGS": "-ObjC",
            "HEADER_SEARCH_PATHS": ["$(inherited)"]
        ]
    )
    
  2. 启用项目级基础设置(可选但推荐)
    取消注释Project中的settings: projectSettings,让项目级的模块化配置生效,避免后续其他依赖出现类似问题:

    let project = Project(
        name: "CoreData",
        settings: projectSettings, // 取消注释这一行
        targets: [
            // ... 原有target配置
        ]
    )
    
  3. 清理缓存并重新生成项目
    执行以下命令清除旧的构建缓存和生成文件,确保新配置生效:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:22:44