在Xcode中使⽤SwiftPackage
⽬前,在 macOS/iOS 开发中,我们通常使⽤ CocoaPods 或 Carthage 等⾮官⽅⼯具来管理项⽬⼯程中对第三⽅开源库的依赖。
git使用详解Swift Package Manager(Swift 包管理器,⼀般简称 SwiftPM 或者 SPM)是苹果官⽅提供的⼀个⽤于管理源代码分发的⼯具,旨在使分享代码和复⽤其他⼈的代码变得更加容易。该⼯具可以直接帮助我们编译和链接 Swift packages(包),管理依赖关系、版本控制,以及⽀持灵活的代码分发和团队协作。
关于 Swift Package Manager 的详细介绍,可以参考去年的 WWDC 2018 Session 411: Getting to Know Swift Package Manager,以及我总结的这篇⽂章:
WWDC 2018:细说 Swift 包管理⼯具
SwiftPM ⼀开始仅⽀持 macOS 和 Linux 平台上的 Swift 开发,且只能通过命令⾏的⽅式来使⽤。在最新的 Xcode 11 中集成
了 libSwiftPM,并提供了图形化操作界⾯,使 Swift Package ⽀持 iOS/watchOS/tvOS 等平台。
下⽂我们将介绍如何在 Xcode 11 中使⽤ Swift Package 引⼊第三⽅开源库或私有代码库。
1. 如何添加 Package
我们先通过 Xcode 11 新建⼀个 Swift iOS ⼯程,假设名为 MyTestProject,然后可以通过如下两种⽅式添加 Swift Package 依赖:
Xcode Menu -> File -> Swift Packages -> Add
在 Xcode ⼯程中选中当前 Project 名称 -> 选择 Swift Packages -> 点击 + 图标添加
在弹出的窗⼝中,我们可以输⼊要依赖的 Package 的 git 仓库地址,例如,我们这⾥要在⼯程中添加 Yams 这个 Swift YAML ⽂件解析的开源库,则可以在输⼊框中填写其在 GitHub 上的 git url,如下图所⽰:
此外,我们可以在 Xcode -> -> Accounts 中添加并登录⾃⼰的 GitHub/GitLab账号或者公司内部私有 Git 服务器账号,然后就可以在 Choose Package Repository 窗⼝中直接选择你⾃⼰的或者已关注的 Swift Package,如下图:
选择好要依赖的 Package 后,点击 Next 按钮进⾏版本号设置。我们可以指定 Package 的版本号范围,规则如下,与 CocoaPods 类似:
Up to Next Major: 当前指定的版本号到下⼀个⼤版本号之间的最新版本,例如 2.0.0 ~ 3.0.0(不包含 3.0.0)
Up to Next Major:
Up to Next Minor:
Up to Next Minor: 当前指定的版本号到下⼀个次版本号之间的最新版本,例如 2.0.0 ~ 2.1.0(不包含 2.1.0)
Range: 指定的两个版本号之间的最新版本,例如 2.1.0 ~ 2.7.2(不包含 2.7.2)
Range:
Exact: 指定使⽤某⼀具体的版本号
Exact:
同时,我们也可以指定要依赖当前 Package git 仓库的某⼀个分⽀或者某⼀次 commit。最后,勾选当前 Package 要添加到⼯程中的哪些 Targets,即可。
添加好 Package 之后,我们就可以在 Xcode ⼯程中查看到相关信息,如下图:
接下来我们就可以在代码中 import Yams 然后调⽤它的相关 API 了。
2. Package 概览
下⾯我们介绍⼀下 Swift Package 的内部结构。
⼀个 Package(包)由 Swift 源码⽂件和⼀个清单⽂件组成。这个清单⽂件被命名为 Package.swift,它使⽤ PackageDescription 模块来定义包的名称、内容以及依赖关系。
以 Yams 为例,它包含的内容如下:
Package.swift: 包的清单⽂件,⽤于描述包的名称、内容、依赖关系、⽀持的 Swift 版本号;
Sources: 源码⽂件夹,通常包括 C/C++ 代码和 Swift 代码等;
Tests: 单元测试代码
⽽ Package.swift ⽂件的⼤致内容如下:
另外,如果⼀个 Package 依赖了另⼀个 Package,也需要在 Package.swift ⽂件中进⾏声明。例如,有⼀个 Package 叫 "DesignTheme",它依赖了 "DesignFont",则需要在 "DesignTheme" 的 Package.swift ⽂件中添加如下依赖代码:
dependencies: [
.package(url:"github/WWDC19/DesignFont.git"),
]
此时,当在 Xcode ⼯程的 Swift Packages 中添加了 "DesignTheme",同时就会⾃动下载依赖 "DesignFont",不需要我们再⼿动添加了。
因此,对于⼀个 Xcode ⼯程,当其依赖了⼀些 Swift Packages 后,在编译链接时,SwiftPM 会⾃动编译每个 Package 并链接到主可执⾏⽂件中。
PS: 对于 SwiftPM 的⼀些基本概念,例如:Modules、Packages、Products、Dependencies、Targets 等,在 官⽹已经有⾮常PS:
详细的描述和定义,另外,也可以参见我之前写的这篇⽂章,这⾥不再赘述。
3. Package 依赖详解
本节我们详细介绍⼀下 Swift Package 之间互相依赖的⼀些细节。
如前⾯所述,假如我们在 Demo ⼯程(名为 "Lunch")中,除了引⼊ "Yams" Package 外,⼜引⼊了⼀个 "DesignTheme" Package,如下图:
此时,如果 "DesignTheme" Package ⼜同时依赖 "DesignFont" 和 "DesignColor" 两个库,我们就会在 Xcode ⼯程的 Package 依赖列表中看到⾃动引⼊了这两个依赖的 Package: