基础介绍
Swift Package Manager(简称 SPM)是苹果官方为 Swift 语言提供的依赖管理工具。它与 Swift 语言深度集成,支持跨平台开发(包括 iOS、macOS、Linux),用于自动化处理包的下载、编译、链接和依赖管理。
核心概念
SPM 涉及几个核心概念:
- Package:一个包含 Swift 源代码和
Package.swift清单文件的目录。 - Products:包对外提供的产物,主要包括库(Library)和可执行程序(Executable)。库是最常见的类型,允许其他代码导入和使用。
- Target:构建的基本单元,包含一组源代码文件,并可以依赖其他目标。
- Dependencies:包所需的其他包,SPM 会自动获取和构建这些依赖项。
- Tools version:指定包所需的最低 Swift 工具链版本。
主要优势
SPM 具有以下优势:
- 官方原生支持:由苹果开发,与 Swift 语言和 Xcode 深度集成,无需额外安装。
- 跨平台:在所有支持 Swift 的平台上(如 Linux、macOS、Windows)均可使用。
- 声明式依赖:通过
Package.swift文件声明依赖关系,简洁明了。 - 自动化管理:自动处理依赖的下载、编译和版本冲突解决(遵循语义化版本控制)。
- 与 Xcode 无缝集成:在 Xcode 中可以直接编辑和管理 Swift 包,添加依赖时只需输入包 URL 或导入本地包。
常用命令
以下是一些常用的 SPM 命令:
swift package init --type library # 初始化一个库包
swift build # 构建包
swift test # 运行测试
swift run <executable-target> # 运行可执行目标
swift package resolve # 解析依赖
swift package update # 更新依赖
基本使用
创建 Swift 包
使用命令行可以快速创建包:
# 创建一个库包
swift package init --name MyLib --type library
# 创建一个可执行包
swift package init --name MyLib --type executable
执行上述命令后,会在当前目录生成标准的包结构。例如,库包的结构如下:
MyLib/
├── Sources/
│ └── MyLib/
│ └── MyLib.swift
├── Tests/
│ └── MyLibTests/
│ └── MyLibTests.swift
└── Package.swift
Package.swift 文件
Package.swift 是包的清单文件,用于配置包的基本信息。一个典型的示例如下:
// swift-tools-version: 6.0
import PackageDescription
let package = Package(
name: "MyLib",
platforms: [.iOS(.v18), .macOS(.v15)],
products: [
.library(name: "MyLib", targets: ["MyLib"])
],
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0")
],
targets: [
.target(
name: "MyLib",
dependencies: ["Alamofire"],
resources: [.process("Resources")]
),
.testTarget(
name: "MyLibTests",
dependencies: ["MyLib"]
)
]
)
构建和测试
完成代码编写后,可以使用以下命令进行构建和测试:
swift build # 编译包
swift test # 运行测试
swift run # 运行包(如果包包含可执行目标)
在 Xcode 中管理包
Xcode 提供了直观的界面来管理 Swift 包。
导入包
- 在 Xcode 中打开你的项目。
- 选择菜单栏的
File > Add Packages...。 - 在弹出的窗口中,你可以添加本地包或通过 URL 添加远程包。
- 点击
Add Package,Xcode 会自动解析并下载包及其依赖。 - 导入的包会出现在项目导航器的
Package Dependencies部分,之后可以在代码中直接import使用。
删除包
如果在 Xcode 中导入包后,需要删除它,可以手动编辑项目文件。具体方法是打开项目 .xcodeproj 包内的 project.pbxproj 文件,删除与包相关的条目,然后保存文件。