BaseCommon/Package.swiftlet package = Package(
name: "BaseCommon",
// ...
dependencies: [
.package(path: "../BaseCore") // 👈 第1步:声明依赖 BaseCore 包
],
targets: [
.target(
name: "BaseCommon",
dependencies: [
.product(name: "BaseCore", package: "BaseCore") // 👈 第2步:在 Target 中使用 BaseCore
]
)
]
)
dependencies 中声明包依赖dependencies: [
.package(path: "../BaseCore") // 告诉 Swift Package Manager:BaseCommon 依赖 BaseCore 这个包
]
targets 中使用这个包targets: [
.target(
name: "BaseCommon",
dependencies: [
.product(name: "BaseCore", package: "BaseCore") // 告诉编译器:BaseCommon Target 需要使用 BaseCore 这个 product
]
)
]
当 A 依赖 B,B 依赖 C 时,A 会自动获得对 C 的访问权限,这就是传递依赖。
xdz 项目
└── 依赖 BaseCommon
└── 依赖 BaseCore ✅ (传递依赖)
xdz 项目添加 BaseCommon 依赖
// 在 Xcode 中添加 BaseCommon 包依赖
Swift Package Manager 自动解析依赖树
xdz 需要 BaseCommon
→ 检查 BaseCommon 的 Package.swift
→ 发现 BaseCommon 依赖 BaseCore
→ 自动将 BaseCore 也添加到依赖树中
结果
在 BaseCommon/Sources/BaseCommon/Common/Network/NetworkHelper.swift 中:
import BaseCore // ✅ 可以导入,因为 Package.swift 中配置了依赖
public class NetworkHelper {
// 可以使用 BaseCore 中的类型
private let networkManager: NetworkManager // NetworkManager 来自 BaseCore
}
在 xdz/xdz/xdzApp.swift 中:
import BaseCommon // ✅ 导入 BaseCommon
// 因为传递依赖,BaseCore 也被自动引入了
// 所以可以直接使用 BaseCore 的类型(如果需要)
import BaseCore // ✅ 可选,因为已经通过 BaseCommon 传递了
// xdz/xdz/SomeFile.swift
import BaseCommon // 只导入 BaseCommon
func someFunction() {
// 使用 BaseCommon 的 NetworkHelper
let helper = NetworkHelper.shared // ✅ 来自 BaseCommon
// NetworkHelper 内部使用了 BaseCore 的 NetworkManager
// 虽然我们没有直接 import BaseCore,但传递依赖让它可用
}
1. xdz 导入 BaseCommon
↓
2. Swift Package Manager 检查 BaseCommon 的依赖
↓
3. 发现 BaseCommon 依赖 BaseCore
↓
4. 自动将 BaseCore 添加到编译依赖中
↓
5. xdz 可以访问 BaseCommon 和 BaseCore
在终端运行:
cd xdz_ios/xdz
swift package show-dependencies # 如果项目支持 SPM
xdzxdz在 xdz/xdz/xdzApp.swift 中:
import SwiftUI
import BaseCommon // 只导入 BaseCommon
@main
struct xdzApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
init() {
// 测试:使用 BaseCommon(需要 BaseCore)
let helper = NetworkHelper.shared // ✅ 来自 BaseCommon
// NetworkHelper 内部使用了 BaseCore,但不需要直接导入
}
}
如果编译通过,说明传递依赖正常工作!
┌─────────────┐
│ BaseCore │ (基础层,不依赖其他)
└──────┬──────┘
│
│ 依赖
│
┌──────▼──────────┐
│ BaseCommon │ (依赖 BaseCore)
└──────┬──────────┘
│
│ 依赖(传递)
│
┌──────▼──────────┐
│ CapabilityPush │ (依赖 BaseCore)
└──────┬──────────┘
│
│ 依赖(传递)
│
┌──────▼──────┐
│ xdz │ (业务项目)
│ │ - 依赖 BaseCommon → 自动获得 BaseCore ✅
│ │ - 依赖 CapabilityPush → 自动获得 BaseCore ✅
└─────────────┘
dependencies:声明包级别的依赖targets[].dependencies:声明 Target 级别的依赖就像: