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

iOS-Tuist外部依赖fetch与generate报错问题求助

Tuist v2 依赖配置问题排查与解决

环境与依赖配置

使用Tuist v2.7,通过Dependencies.swift管理项目外部依赖,配置代码如下:

import ProjectDescription

let dependencies = Dependencies(
    carthage: [],
    swiftPackageManager: [
        .package(url: "https://github.com/onevcat/Kingfisher", .upToNextMajor(from: "7.3.2")),
        .package(url: "https://github.com/pointfreeco/swift-composable-architecture", .upToNextMajor(from: "0.40.2")),
        .package(url: "https://github.com/stripe/stripe-ios", .upToNextMajor(from: "22.8.1")),
        .package(url: "https://github.com/segmentio/analytics-ios", .upToNextMajor(from: "4.1.6")),
        .package(url: "https://github.com/OneSignal/OneSignal-XCFramework", .upToNextMajor(from: "3.11.2")),
        .package(url: "https://github.com/AppsFlyerSDK/segment-appsflyer-ios", .upToNextMajor(from: "6.8.1")),
        .package(url: "https://github.com/newrelic/newrelic-ios-agent-spm", .upToNextMajor(from: "7.3.8")),
        .package(url: "https://github.com/iterable/swift-sdk", .upToNextMajor(from: "6.4.7")),
        .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", .upToNextMajor(from: "4.2.2")),
        .package(url: "https://github.com/airbnb/lottie-ios", .upToNextMajor(from: "3.4.3")),
        .package(url: "https://github.com/pusher/pusher-websocket-swift", .upToNextMajor(from: "10.1.1")),
        .package(url: "https://github.com/Juanpe/SkeletonView", .upToNextMajor(from: "1.30.2")),
        .package(url: "https://github.com/persona-id/inquiry-ios-2", .upToNextMajor(from: "2.4.0")),
        .package(url: "https://github.com/gymshark/ios-stack-kit", .upToNextMajor(from: "1.2.0"))
    ],
    platforms: [.iOS]
)

依赖引用实现

通过扩展TargetDependency简化依赖引用,代码如下:

extension TargetDependency {
    static let oneSignal = TargetDependency.external(name: "OneSignal-XCFramework")
    static let kingFisher = TargetDependency.external(name: "Kingfisher")
    static let skeletonView = TargetDependency.external(name: "SkeletonView")
    static let pusher = TargetDependency.external(name: "pusher-websocket-swift")
    static let lottie = TargetDependency.external(name: "lottie-ios")
    static let iterable = TargetDependency.external(name: "swift-sdk")
    static let segment = TargetDependency.external(name: "analytics-ios")
    static let appsFlayer = TargetDependency.external(name: "segment-appsflyer-ios")
    static let stripe = TargetDependency.external(name: "stripe-ios")
    static let tca = TargetDependency.external(name: "swift-composable-architecture")
    static let stackKit = TargetDependency.external(name: "ios-stack-kit")
    static let newRelic = TargetDependency.external(name: "newrelic-ios-agent-spm")
    static let keychain = TargetDependency.external(name: "KeychainAccess")
    static let persona = TargetDependency.external(name: "inquiry-ios-2")
}

在Feature模块中引用依赖:

public static func joinFeature() -> (source: Self, test: Self) {
    frameworkBuilder(
        name: .feature(.joinFeature),
        dependencies: [
            .target(.feature(.alert)),
            .target(.designSystem),
            .target(.scenes),
            .target(.clientService),
            .tca,
            .kingFisher
        ],
        hasResources: true,
        product: .framework,
        folder: folder
    )
}

框架构建工具函数:

static func frameworkBuilder(
    name: TargetName,
    headers: ProjectDescription.Headers? = nil,
    dependencies: [TargetDependency] = [],
    settings: ProjectDescription.Settings? = nil,
    hasResources: Bool = false,
    product: Product = .framework,
    folder: String = ""
) -> (source: Target, test: Target) {
    return (
        source: Target(
            name: name.name,
            platform: .iOS,
            product: product,
            bundleId: "\(name.name).framework",
            deploymentTarget: .iOS(targetVersion: "14.0", devices: [.ipad, .iphone]),
            infoPlist: .default,
            sources: ["Targets/\(folder)\(name.name)/Sources/**"],
            resources: hasResources ? ["Targets/\(folder)\(name.name)/Resources/**"] : [],
            headers: headers,
            dependencies: dependencies,
            settings: settings
        ),
        test: Target(
            name: name.name + "Tests",
            platform: .iOS,
            product: .unitTests,
            bundleId: "\(name.name).framework.test",
            infoPlist: .default,
            sources: ["Targets/\(folder)\(name.name)/Tests/**"],
            dependencies: [.target(name: name.name)]
        )
    )
}

遇到的问题

  • 问题1:拉取依赖时报错
    执行tuist dependencies fetch,依赖拉取成功但抛出错误:
The dependency kind remoteSourceControl is not supported.
Consider creating an issue using the following link: https://github.com/tuist/tuist/issues/new/choose
  • 问题2:生成项目时报错
    拉取依赖后执行tuist generate,报错:
`OneSignal-XCFramework` is not a valid configured external dependency
Consider creating an issue using the following link: https://github.com/tuist/tuist/issues/new/choose

问题解决(更新)

经排查,问题根源在于TargetDependency.external中使用的依赖名称错误。正确的依赖名称可以从项目生成的graph.json文件中获取。


内容的提问来源于stack exchange,提问作者Olcay Ertaş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:01:24