# 依赖配置详解 - BaseCommon 如何依赖 BaseCore ## 🔍 关键配置位置 ### BaseCommon/Package.swift ```swift let package = Package( name: "BaseCommon", // ... dependencies: [ .package(path: "../BaseCore") // 👈 这里声明:BaseCommon 依赖 BaseCore 这个包 ], targets: [ .target( name: "BaseCommon", dependencies: [ .product(name: "BaseCore", package: "BaseCore") // 👈 这里使用:BaseCommon Target 使用 BaseCore 这个 product ] ) ] ) ``` ## 📝 两步配置详解 ### 第1步:声明包依赖(Package Level) ```swift dependencies: [ .package(path: "../BaseCore") // 告诉 Swift Package Manager:BaseCommon 这个包依赖 BaseCore 包 ] ``` **作用**: - 告诉 Swift Package Manager:BaseCommon 需要 BaseCore - 指定 BaseCore 的位置(相对路径 `../BaseCore`) - 这是**包级别**的依赖声明 ### 第2步:在 Target 中使用(Target Level) ```swift targets: [ .target( name: "BaseCommon", dependencies: [ .product(name: "BaseCore", package: "BaseCore") // 告诉编译器:BaseCommon Target 需要使用 BaseCore 这个 product ] ) ] ``` **作用**: - 告诉编译器:BaseCommon Target 的代码可以使用 BaseCore - 这样代码中才能 `import BaseCore` - 这是**Target 级别**的依赖使用 ## 💻 代码中的体现 ### BaseCommon 的代码中使用 BaseCore 在 `BaseCommon/Sources/BaseCommon/Common/Network/NetworkHelper.swift` 中: ```swift import Foundation import BaseCore // ✅ 可以导入,因为 Package.swift 中配置了依赖 public class NetworkHelper { private let networkManager: NetworkManager // ✅ NetworkManager 来自 BaseCore public init(networkManager: NetworkManager = NetworkManager.shared) { self.networkManager = networkManager } } ``` **为什么可以 `import BaseCore`?** - 因为 `Package.swift` 中配置了依赖 - Swift Package Manager 会自动处理依赖关系 ## 🔗 传递依赖机制 ### 什么是传递依赖? 当 A 依赖 B,B 依赖 C 时,A 会自动获得对 C 的访问权限。 ### 实际例子 ``` xdz 项目 └── 依赖 BaseCommon └── 依赖 BaseCore ✅ (自动传递) ``` ### 工作原理 1. **xdz 项目添加 BaseCommon 依赖** - 在 Xcode 中添加 `../BaseCommon` 包 2. **Swift Package Manager 自动解析** ``` xdz 需要 BaseCommon → 读取 BaseCommon/Package.swift → 发现 dependencies: [.package(path: "../BaseCore")] → 自动将 BaseCore 也添加到依赖树中 ``` 3. **结果** - xdz 可以直接使用 BaseCommon ✅ - xdz 也可以直接使用 BaseCore ✅(传递依赖) - **不需要手动添加 BaseCore** ## 🎯 完整示例 ### 场景:xdz 项目使用 BaseCommon ```swift // xdz/xdz/xdzApp.swift import SwiftUI import BaseCommon // 只导入 BaseCommon @main struct xdzApp: App { var body: some Scene { WindowGroup { ContentView() } } init() { // 使用 BaseCommon 的 NetworkHelper let helper = NetworkHelper.shared // ✅ 来自 BaseCommon // NetworkHelper 内部使用了 BaseCore 的 NetworkManager // 虽然我们没有直接 import BaseCore,但传递依赖让它可用 } } ``` ### 依赖解析过程 ``` 1. xdz 导入 BaseCommon ↓ 2. Swift Package Manager 检查 BaseCommon/Package.swift ↓ 3. 发现 dependencies: [.package(path: "../BaseCore")] ↓ 4. 自动将 BaseCore 添加到编译依赖中 ↓ 5. xdz 可以访问 BaseCommon 和 BaseCore ✅ ``` ## 📊 依赖关系图 ``` ┌─────────────┐ │ BaseCore │ (基础层,不依赖其他) │ │ │ Package.swift: │ │ dependencies: [] │ └──────┬──────┘ │ │ .package(path: "../BaseCore") │ ┌──────▼──────────┐ │ BaseCommon │ (业务封装层) │ │ │ Package.swift: │ │ dependencies: [ │ │ .package( │ │ path: │ │ "../BaseCore"│ │ ) │ │ ] │ │ │ │ targets: [ │ │ .target( │ │ dependencies:│ │ [.product( │ │ name: │ │ "BaseCore"│ │ )] │ │ ) │ │ ] │ └──────┬──────────┘ │ │ 传递依赖 │ ┌──────▼──────┐ │ xdz │ (业务项目) │ │ - 添加 BaseCommon 依赖 │ │ - 自动获得 BaseCore ✅ └─────────────┘ ``` ## 🔧 验证方法 ### 方法 1:查看 Package.swift ```bash cat BaseCommon/Package.swift ``` 你会看到: - `dependencies: [.package(path: "../BaseCore")]` ✅ - `targets[].dependencies: [.product(name: "BaseCore", package: "BaseCore")]` ✅ ### 方法 2:查看代码中的使用 ```bash grep -r "import BaseCore" BaseCommon/Sources/ ``` 你会看到多个文件都 `import BaseCore`,说明依赖配置成功。 ### 方法 3:在 Xcode 中验证 1. 添加 BaseCommon 依赖后 2. 在 Xcode 左侧导航栏,展开 "Package Dependencies" 3. 你会看到: - BaseCommon ✅ - BaseCore ✅ (自动传递) ## 💡 总结 **BaseCommon 依赖 BaseCore 的配置:** 1. **Package.swift 的 `dependencies`**:声明包依赖 ```swift dependencies: [ .package(path: "../BaseCore") ] ``` 2. **Package.swift 的 `targets[].dependencies`**:在 Target 中使用 ```swift targets: [ .target( name: "BaseCommon", dependencies: [ .product(name: "BaseCore", package: "BaseCore") ] ) ] ``` 3. **代码中使用**:`import BaseCore` **传递依赖机制:** - Swift Package Manager 自动处理 - xdz 添加 BaseCommon 后,BaseCore 自动传递 - 不需要手动添加 BaseCore