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"]), ] )
遇到的错误
- Package B编译报错:
x-xcode-log://7C2F67D1-F6A1-4BE1-8E94-DC7E769241AD product 'PromiseKit' required by package 'Package_B' target 'Package_B' not found.
- 添加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
相关产品推荐
相关产品推荐

