依赖配置详解.md 6.0 KB

依赖配置详解 - BaseCommon 如何依赖 BaseCore

🔍 关键配置位置

BaseCommon/Package.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)

dependencies: [
    .package(path: "../BaseCore")  // 告诉 Swift Package Manager:BaseCommon 这个包依赖 BaseCore 包
]

作用

  • 告诉 Swift Package Manager:BaseCommon 需要 BaseCore
  • 指定 BaseCore 的位置(相对路径 ../BaseCore
  • 这是包级别的依赖声明

第2步:在 Target 中使用(Target Level)

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 中:

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

// 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

cat BaseCommon/Package.swift

你会看到:

  • dependencies: [.package(path: "../BaseCore")]
  • targets[].dependencies: [.product(name: "BaseCore", package: "BaseCore")]

方法 2:查看代码中的使用

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:声明包依赖

    dependencies: [
       .package(path: "../BaseCore")
    ]
    
  2. Package.swift 的 targets[].dependencies:在 Target 中使用

    targets: [
       .target(
           name: "BaseCommon",
           dependencies: [
               .product(name: "BaseCore", package: "BaseCore")
           ]
       )
    ]
    
  3. 代码中使用import BaseCore

传递依赖机制:

  • Swift Package Manager 自动处理
  • xdz 添加 BaseCommon 后,BaseCore 自动传递
  • 不需要手动添加 BaseCore