Swift中Package Manager的使用
一、Package文件构成
Swift Package Manager简称SPM是苹果官方为swift语言提供的强大的依赖管理工具。能够自动化地处理包的依赖下载、编译、链接和管理。
Products:在包中的每个target最终都可能构建成一个Library或者一个execute作为product,这是package编译后的产物,
Target:构建单元,包含一组源代码文件,可以是一个库,可执行文件等。可依赖其他目标,如library、executable。一个package可以包含多个target
Dependencies:package所依赖的其他package,SPM会自动下载并解析这些依赖,确保项目的所有库都能正确构建。
Tool Version:最低支持的Swift工具链版本。

二、SPM的优点
对比Cocoapods,SPM具有以下优点。
- 无需安装,Xcode11以上版本自带
- 苹果官方维护,不用担心和Cocoapods一样停止维护
- 安装第三方库的时候比Cocoapods快(依赖源在github,有些要翻墙)
- 使用SPM构建时比Cocoapods快
三、SPM缺点
- 每次打开App 都会重新拉取 所有依赖的库
- 更新时间长(访问github 还需要进行科学上网)
- 支持文档少,
- 远端仓库对网络要求高
四、创建Package的两种方式:
1、常用命令:
bash
mkdir SwiftPackageTest # 生成的Package的名称
cd SwiftPackageTest
swift package init --type library # 初始化库包
swift build # 构建
swift test # 运行测试
swift run <executable-target> # 运行可执行目标
swift package resolve # 解析依赖
swift package update # 更新依赖
基本使用
通过命令可以快速
bash
# 创建一个库包
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清单文件的内容通常如下:
MyLib.swift文件
Sources目录是实现代码的存放位置,MyLib.swift一般作为程序的入口,用于处理命令行参数并调用核心功能。
构建和测试
bash
# 编译包
swift build
# 运行测试
swift test
# 运行包
swift run
2、使用Xcode界面创建
Xcode---> 工具栏File--->New--->Package--->Libary

五、Package的配置
less
// swift-tools-version:6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
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"]
)
]
)
-
name: Swift包的名字,或者' nil '使用包的Git URL来推断名字。
-
defaultLocalization:资源的默认本地化。
-
platforms:具有自定义部署目标的受支持平台列表。
- 支持的平台和对应的系统版本
- platforms:[
- .macOS(.v11), .iOS(.v12),.tvOS(.v12)
- ]
-
pkgConfig: C模块的名称。如果存在,Swift包管理器会搜索 <名称>。获取系统目标所需的附加标志。
-
providers:系统目标的包提供程序。
-
products:此包提供给客户使用的产品列表。
编译后的产物一般分为两种 可执行文件 静态库或动态库
- dependencies:包依赖列表。
-
添加依赖的包,一般指向包源的git路径和版本环境,或者包依赖的本地路径
-
依赖包的添加支持以下五种方式
- git源 + 确定的版本号
- git源 + 版本区间
- git源 + commit号
- git源 + 分支名
- 本地路径
less
.package(url: "https://github.com/Alamofire/Alamofire.git", .exact("1.2.3")),
.package(url:"https://github.com/Alamofire/Alamofire.git", .branch("master")),
.package(url:"https://github.com/Alamofire/Alamofire.git", from: "1.2.3"),
.package(url:"https://github.com/Alamofire/Alamofire.git",.revision("e74b07278b926c9ec6f9643455ea00d1ce04a021"),
.package(url: "https://github.com/Alamofire/Alamofire.git", "1.2.3"..."4.1.3"),
.package(path: "../Foo"),
- targets:作为这个包的一部分的目标列表。
-
target是Package的基本构建,和xcodeproject一样,Package可以有多个target
-
target分为三种类型
- 常规性 .regular
- 测试类型 .test
- 系统库类型 .system
- swiftLanguageModes:此包兼容的Swift语言模式列表。
六、在Xcode中导入包
- 在Xcode中打开你的项目。
- 选择菜单栏的File > Add Packages...。
- 在弹出的窗口中,选择Add Local添加本地的package,或输入包存在的网址。
- 选择完成后,点击Add Package,Xcode会自动解析并下载该包及其所有依赖项。
- 依赖的包会出现在项目导航器的Package Dependencies部分,然后可以在代码中直接import使用。
在Xcode中删除包 如果在Xcode中导入包后,无法在Package Dependencies部分删除包,可以在项目.xcodeproj包内内容下的project.pbxproj里进行包的删除,删除后保存文件即可。