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

Swift Package Manager本地包依赖层级构建及依赖访问问题求助

SPM本地包依赖树构建问题

包结构与当前配置

Core包(Package A)

作为核心包,包含主要原生代码及外部依赖,配置如下:

let package = Package(
    name: "Core",
    platforms: [
      .iOS(.v14)
    ],
    products: [
        .library(
            name: "Core",
            targets: ["Core"]),
    ],
    dependencies: [
      .package(url: "https://github.com/mxcl/PromiseKit", .exact("6.13.1")),
      .package(url: "https://github.com/PromiseKit/Foundation.git", from: "3.0.0"),
    ],
    targets: [
        .target(
            name: "Core",
            dependencies: [
                           .product(name: "PMKFoundation", package: "Foundation"),
                           "PromiseKit",
                          ]),
        .testTarget(
            name: "CoreTests",
            dependencies: ["Core"]),
    ]
)

Package B

依赖本地Core包,需访问Core使用的外部依赖,当前配置:

let package = Package(
    name: "Package_B",
    platforms: [
      .iOS(.v14)
    ],
    products: [
        .library(
            name: "Package_B",
            targets: ["Package_B"]),
    ],
    dependencies: [
      .package(path: "../Core"),
    ],
    targets: [
        .target(
            name: "Package_B",
            dependencies: [
              "Core",
              "PromiseKit",
            ]),
        .testTarget(
            name: "Package_BTests",
            dependencies: ["Package_B"]),
    ]
)

Package C

依赖Package B,需访问Package B、Core及Core的外部依赖,当前配置:

let package = Package(
    name: "Package_C",
    products: [
        .library(
            name: "Package_C",
            targets: ["Package_C"]),
    ],
    dependencies: [
      .package(path: "../Package_B"),
      .package(url: "https://github.com/ZipArchive/ZipArchive.git", from: "2.2.0"),
    ],
    targets: [
        .target(
            name: "Package_C",
            dependencies: ["Core","Package_B", "PromiseKit", "ZipArchive"]),
        .testTarget(
            name: "Package_CTests",
            dependencies: ["Package_C"]),
    ]
)

遇到的错误

  1. Package B编译报错:
x-xcode-log://7C2F67D1-F6A1-4BE1-8E94-DC7E769241AD product 'PromiseKit' required by package 'Package_B' target 'Package_B' not found.
  1. 添加PromiseKit的package依赖到Package B后,出现导入错误:
No such module 'PromiseKit'
No such module 'Core'

问题根源

SPM中,子包直接写外部依赖名称(如"PromiseKit")时,会优先在自身的package依赖列表中查找对应包,而非自动使用上层包的传递依赖。重复添加外部依赖还可能导致版本冲突,同时路径配置或缓存问题也会引发模块找不到的错误。

正确配置方案

1. 修正Package B的依赖引用

无需在Package B的dependencies中重复添加PromiseKit的package,而是通过Core的传递依赖来引用,修改target的依赖写法:

let package = Package(
    name: "Package_B",
    platforms: [
      .iOS(.v14)
    ],
    products: [
        .library(
            name: "Package_B",
            targets: ["Package_B"]),
    ],
    dependencies: [
      .package(path: "../Core"),
    ],
    targets: [
        .target(
            name: "Package_B",
            dependencies: [
              "Core",
              // 通过传递依赖引用PromiseKit,指定包名而非路径
              .product(name: "PromiseKit", package: "PromiseKit")
            ]),
        .testTarget(
            name: "Package_BTests",
            dependencies: ["Package_B"]),
    ]
)

2. 修正Package C的依赖引用

Package C无需直接添加Core的路径依赖(通过Package B的传递依赖即可获取),同时统一平台版本,避免冲突:

let package = Package(
    name: "Package_C",
    platforms: [.iOS(.v14)],
    products: [
        .library(
            name: "Package_C",
            targets: ["Package_C"]),
    ],
    dependencies: [
      .package(path: "../Package_B"),
      .package(url: "https://github.com/ZipArchive/ZipArchive.git", from: "2.2.0"),
    ],
    targets: [
        .target(
            name: "Package_C",
            dependencies: [
                "Package_B",
                // 通过传递依赖引用Core
                .product(name: "Core", package: "Core"),
                // 通过传递依赖引用PromiseKit
                .product(name: "PromiseKit", package: "PromiseKit"),
                .product(name: "ZipArchive", package: "ZipArchive")
            ]),
        .testTarget(
            name: "Package_CTests",
            dependencies: ["Package_C"]),
    ]
)

3. 辅助排查步骤

  • 统一所有包的platforms版本,避免因平台不一致导致的依赖解析失败;
  • 清理Xcode缓存:选择File > Packages > Reset Package Caches,再执行File > Packages > Update to Latest Package Versions;
  • 确认本地包的相对路径正确(如../Core是否指向Core包的实际位置)。

内容的提问来源于stack exchange,提问作者kivu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:20:34