如何创建并使用一个私有 Swift Package Manager 库

在 iOS 开发中,Swift Package Manager(简称 SPM)已经成为管理依赖的主流方式。除了引入开源三方库之外,我们在实际项目中也常常需要 沉淀自己的业务组件,或者在公司内部维护 私有的基础库。本文带你从零开始创建一个私有 SPM 库,并演示如何在项目中使用它。

一、为什么要用私有 SPM 库?

在团队协作中,把通用模块抽离出来有几个好处:

  • 代码复用:避免重复造轮子。
  • 统一升级:更新一次库版本,所有依赖的项目都能升级。
  • 隔离职责:业务和基础库解耦,代码结构更清晰。
  • 安全可控:公司内部业务代码不适合放到 GitHub,可以托管到私有 GitLab/GitHub 企业仓库。

二、创建私有库的基本步骤

假设我们要创建一个名为 MyPrivateLib 的库,并依赖 Alamofire(同样放在私有 GitLab 上)。

1. 新建库

在终端执行:

mkdir MyPrivateLib
cd MyPrivateLib
swift package init --type library

生成的目录结构:

MyPrivateLib
├── Package.swift
├── Sources
│   └── MyPrivateLib
│       └── MyPrivateLib.swift
└── Tests
    └── MyPrivateLibTests
        └── MyPrivateLibTests.swift

2. 编辑 Package.swift

Package.swift 中声明依赖,并配置 target:

// swift-tools-version:5.7
import PackageDescription

let package = Package(
    name: "MyPrivateLib",
    platforms: [
        .iOS(.v13),
        .macOS(.v12)
    ],
    products: [
        .library(
            name: "MyPrivateLib",
            targets: ["MyPrivateLib"]),
    ],
    dependencies: [
        // 依赖私有仓库的 Alamofire
        .package(url: "git@github.com:Alamofire/Alamofire.git",
                 .upToNextMajor(from: "5.0.0"))
    ],
    targets: [
        .target(
            name: "MyPrivateLib",
            dependencies: ["Alamofire"]),
        .testTarget(
            name: "MyPrivateLibTests",
            dependencies: ["MyPrivateLib"]),
    ]
)

3. 编写代码

Sources/MyPrivateLib/MyPrivateLib.swift 中:

import Foundation
import Alamofire

public struct MyPrivateLib {
    public static func request(_ url: String) {
        AF.request(url).response { response in
            debugPrint(response)
        }
    }
}

4. 推送到私有 Git 仓库

git init
git add .
git commit -m "init MyPrivateLib"
git remote add origin git@gitlab.com:MyPrivateLib/MyPrivateLib.git
git push -u origin main

三、在项目中使用私有库

在 App 项目的 Package.swift(或通过 Xcode → Add Package Dependency)里添加:

dependencies: [
    .package(url: "git@gitlab.com:MyPrivateLib/MyPrivateLib.git",
             .upToNextMajor(from: "1.0.0"))
],
targets: [
    .target(
        name: "MyApp",
        dependencies: ["MyPrivateLib"])
]

在代码中使用:

import MyPrivateLib

MyPrivateLib.request("https://httpbin.org/get")

3.1 使用 swift package resolve

swift package resolve 命令用于 下载并解析依赖,确保项目依赖完整:

cd MyApp
swift package resolve

执行后会:

  • 下载 Package.swift 中声明的所有依赖。
  • 生成 .build/checkouts 目录,存放下载的依赖源代码。
  • 生成 Package.resolved 文件,锁定依赖版本,保证团队成员版本一致。

注意事项

  1. 每次修改 Package.swift 添加或升级依赖后,需要执行 swift package resolve
  2. 当使用私有库或私有仓库时,确保 SSH Key 或访问权限配置正确,否则会拉取失败。
  3. Package.resolved 文件应提交到 Git,保证 CI/CD 和其他开发者拉取时依赖版本一致。

四、关于依赖传递

  • MyPrivateLib 依赖了 Alamofire,所以 App 在集成时会自动拉取 Alamofire
  • 但是 App 想直接使用 Alamofire,必须自己在 Package.swift 中单独声明依赖。
  • 否则 import Alamofire 会报错,因为依赖默认只对声明的 target 可见。

五、版本管理建议

  1. 每次对外发版时打一个 tag,例如:
git tag 1.0.0
git push origin 1.0.0
  1. 上层项目依赖时用 .upToNextMajor(from: "1.0.0"),可以保证自动升级到 2.0.0 之前的最新版本。
  2. 如果需要锁定版本,则用 .exact("1.0.0")

六、总结

通过以上步骤,我们实现了:

  • 新建一个私有 Swift Package 库。
  • 在库中引入第三方依赖(Alamofire)。
  • 将库托管到私有 GitLab,并在 App 项目中使用。
  • 理解了依赖传递的规则和版本管理方式。
  • 掌握了 swift package resolve 的使用,确保依赖完整且版本锁定。

这样,你就可以在公司内部快速沉淀和分发私有组件,让项目结构更清晰,协作更高效。

私有库地址 https://github.com/EvanCaiDev/MyPrivateLib

学习资料 https://mp.weixin.qq.com/s/HlyqIM9fc2tGUMpkylM0ww

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容