在 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文件,锁定依赖版本,保证团队成员版本一致。
注意事项:
- 每次修改
Package.swift添加或升级依赖后,需要执行swift package resolve。 - 当使用私有库或私有仓库时,确保 SSH Key 或访问权限配置正确,否则会拉取失败。
-
Package.resolved文件应提交到 Git,保证 CI/CD 和其他开发者拉取时依赖版本一致。
四、关于依赖传递
-
MyPrivateLib依赖了Alamofire,所以 App 在集成时会自动拉取Alamofire。 - 但是 App 想直接使用
Alamofire,必须自己在Package.swift中单独声明依赖。 - 否则
import Alamofire会报错,因为依赖默认只对声明的 target 可见。
五、版本管理建议
- 每次对外发版时打一个 tag,例如:
git tag 1.0.0
git push origin 1.0.0
- 上层项目依赖时用
.upToNextMajor(from: "1.0.0"),可以保证自动升级到 2.0.0 之前的最新版本。 - 如果需要锁定版本,则用
.exact("1.0.0")。
六、总结
通过以上步骤,我们实现了:
- 新建一个私有 Swift Package 库。
- 在库中引入第三方依赖(Alamofire)。
- 将库托管到私有 GitLab,并在 App 项目中使用。
- 理解了依赖传递的规则和版本管理方式。
- 掌握了
swift package resolve的使用,确保依赖完整且版本锁定。
这样,你就可以在公司内部快速沉淀和分发私有组件,让项目结构更清晰,协作更高效。