通过SPM分发带链式依赖的XCFramework,如何仅引入顶层框架自动携带所有依赖
SPM 链式依赖XCFramework自动传递配置方案
核心问题是未显式声明依赖传递规则,且Xcode默认的库类型自动判断逻辑会阻断依赖传递,按以下步骤配置即可实现仅引入E包就自动加载所有依赖:
1. 统一所有子包的库类型配置
所有A/B/C/D/E单独包的Package.swift中,library产品必须显式指定类型,不要使用默认的.automatic:
- 优先使用静态库:指定
type: .static,静态库的依赖会被SPM自动合并处理,不需要额外嵌入 - 若必须使用动态库:指定
type: .dynamic,需要确保所有上层依赖都在E的依赖链中显式声明
2. 按层级声明每个包的依赖
每个包需要在dependencies和target.dependencies两层都声明对应的依赖,示例逻辑如下:
- A包仅声明自身的binaryTarget即可
- B包的dependencies引入A包,target的dependencies关联A的产品
- C包的dependencies引入A、B包,target的dependencies关联A、B的产品
- D包的dependencies引入A、B、C包,target的dependencies关联对应产品
- E包需要声明所有上层包的依赖,示例配置如下:
import PackageDescription let package = Package( name: "E", platforms: [.iOS(.v13)], // 替换为你支持的最低系统版本 products: [ .library( name: "E", type: .static, // 动态库此处改为.dynamic即可 targets: ["E"] ) ], dependencies: [ // 本地路径引入示例,远程包替换为url和version参数即可 .package(path: "../A"), .package(path: "../B"), .package(path: "../C"), .package(path: "../D") ], targets: [ .binaryTarget( name: "E", path: "./E.xcframework" // 替换为你的XCFramework实际路径 ), .target( name: "E", dependencies: [ .product(name: "A", package: "A"), .product(name: "B", package: "B"), .product(name: "C", package: "C"), .product(name: "D", package: "D") ] ) ] )
3. 主应用侧验证配置
主应用仅需要添加E包作为依赖即可:
- 若使用静态库:嵌入选项选择
Do Not Embed,SPM会自动把所有依赖的符号合并到主应用二进制 - 若使用动态库:嵌入选项选择
Embed & Sign,SPM会自动把所有传递依赖的动态库都拷贝到应用包的Frameworks目录下 - 配置完成后若出现找不到依赖的报错,先清理Xcode缓存:
Shift + Command + K,再重置SPM包缓存:Xcode菜单栏 -> File -> Packages -> Reset Package Caches
内容的提问来源于stack exchange,提问作者David Homes
相关产品推荐
相关产品推荐

