Highlight
Xcode 13 引入 Swift Package collections,让开发者用可共享的 JSON 清单发现、筛选、签名和导入 Swift 包,并把包元数据直接带入 Xcode 和 SwiftPM 工作流。
核心内容
你从博客复制了一段 Swift 代码,粘到 Xcode 里,第一件事经常是编译失败。模块没有加入项目。接下来要回到文章里找 GitHub 地址,确认包名,挑版本规则,再回到 Xcode 添加依赖。
包越来越多以后,搜索也变成问题。一个团队可能只允许使用审过的包。课程作者希望学生直接拿到配套依赖。博客作者希望读者少走一步。单独给一个 GitHub 链接,不能传达许可证、README、版本记录和产品列表。
Xcode 13 的 Swift Package collections(Swift 包集合)解决这个入口问题。集合是一个通常通过 HTTPS 获取的 JSON 文件,里面列出一组包 URL 和元数据。Xcode 和 Swift Package Manager(Swift 包管理器,SwiftPM)都能读取这份集合。
Apple 还在 Xcode 13 内置了默认集合。演示里,开发者 import Numerics 后遇到缺失模块,Xcode 直接给出 fix-it,并打开新的 Add Package 流程。这个流程显示最新版本、作者、许可证、README 和 Release History。添加完成后,依赖出现在项目的 Swift Packages 标签页,产品也链接到目标的 Frameworks, Libraries, and Embedded Content 阶段。
集合也可以由你自己维护。教育者可以给课程发布一份集合。企业可以给内部团队发布一份审过的集合。社区作者可以给文章配一份集合,让读者按同一组依赖复现实验。
详细内容
集合是一份带元数据的 JSON
(04:28)
Swift Package collections 的基础格式是 JSON。它包含集合级别的名称、概览、关键词、作者,也包含包列表。每个包至少需要 URL。生成工具会自动抓取更多信息。
{
"name": "WWDC21 Demo Collection",
"overview": "Packages to be used in our demo app",
"keywords": ["wwdc21"],
"author": {
"name": "Boris Buegling"
},
"packages": [
{ "url": "https://github.com/apple/swift-format" },
{ "url": "https://github.com/Alamofire/Alamofire" }
]
}
关键点:
name是集合在 Xcode 中显示的名称。overview说明这份集合的用途,添加集合时会展示。keywords用于描述集合主题。author.name标识集合作者。packages是包 URL 列表,Xcode 和 SwiftPM 会从这些 URL 继续读取包信息。
(07:17)
集合也支持为单个包补充元数据。演示里,swift-format 包添加了摘要、关键词、版本限制、排除产品和 README URL。
{
"name": "WWDC21 Demo Collection",
"overview": "Packages to be used in our demo app",
"keywords": ["wwdc21"],
"packages": [
{
"url": "https://github.com/apple/swift-format",
"summary": "Formatting technology for Swift source code.",
"keywords": ["formatting", "swift"],
"versions": ["0.50400.0", "0.50300.0"],
"excludedProducts": ["SwiftFormatConfiguration"],
"readmeURL": "https://github.com/apple/swift-format/blob/main/README.md"
},
{ "url": "https://github.com/Alamofire/Alamofire" }
],
"author": {
"name": "Boris Buegling"
}
}
关键点:
url指向 Swift 包仓库。summary会改善 Xcode 中的展示和搜索结果。keywords给单个包补充搜索关键词。versions限定集合代表的版本范围。excludedProducts可以隐藏不希望读者选择的产品。readmeURL指定 README 地址,Xcode 可以把 README 显示在包详情中。
用生成器创建集合文件
(08:46)
Apple 发布了 Swift Package Collection Generator。输入是一份包 URL 和可选元数据组成的 JSON。输出是一份可分享的集合 JSON。生成器会自动收集包信息,并按最新格式产出文件。
package-collection-generate --verbose input.json collection.json --auth-token
关键点:
package-collection-generate是生成集合的命令。--verbose输出更多过程信息,演示中用它查看生成器抓取包版本的过程。input.json是手写的输入文件,包含包 URL 和可选元数据。collection.json是生成后的集合文件,可继续签名或直接分发。--auth-token用于让工具通过 GitHub API 查询更多元数据。
签名集合,确认作者和完整性
(09:30)
签名是可选步骤。它让 SwiftPM 验证集合作者,也能保护集合内容不被修改。演示使用单独的签名工具,把生成后的 JSON、私钥和证书合成签名集合。
package-collection-sign collection.json collection-signed.json developer-key.pem developer-cert.cer
关键点:
package-collection-sign是签名命令。collection.json是上一阶段生成的集合。collection-signed.json是签名后的输出文件。developer-key.pem是签名用的私钥。developer-cert.cer是对应证书。- SwiftPM 文档说明了可用于签名的证书要求:证书需要有效、未过期、未吊销。
用 SwiftPM 添加和检查集合
(10:15)
SwiftPM 提供 package-collection 子命令。添加集合后,这份集合会进入本机缓存,也会对 Xcode 可用。SwiftPM 的集合能力来自 libSwiftPM(SwiftPM 库),Xcode 的包功能也由它提供。
swift package-collection add https://example.com/collection-signed.json
关键点:
swift调用 SwiftPM 命令行工具。package-collection进入集合管理子命令。add把远端集合加入当前机器的配置。- URL 指向已经发布的集合 JSON,可以是签名集合。
(10:34)
添加后,可以检查整份集合。演示中,输出包含集合元数据、包列表和签名信息。
swift package-collection describe
关键点:
describe不带包 URL 时,查看已配置集合的整体信息。- 输出会显示前面写入的集合元数据。
- 输出会列出集合中的包。
- 如果集合已签名,输出会显示签名者以及 SwiftPM 的验证结果。
(11:11)
也可以针对集合里的单个包查看详情。演示使用 swift-format 的仓库 URL,输出包括可用版本、作者、stars、README URL、Swift tools version、模块和产品。
swift package-collection describe https://github.com/apple/swift-format
关键点:
describe后跟包 URL 时,查看单个包的元数据。https://github.com/apple/swift-format是要检查的包。- 输出会把集合中缓存的包信息展示出来。
- 这些信息也是 Xcode Add Package 流程能显示丰富详情的基础。
在 Xcode 中使用集合里的包
(12:01)
Xcode 也可以添加自定义集合。路径是 File > Add Packages,点击 +,粘贴集合 URL,点击 Load。Xcode 会显示集合包含的包数量和更新时间。集合加入后,包列表出现在 Add Package 面板中。
(13:07)
演示应用从集合中添加 Alamofire,然后在 SwiftUI 视图里发起 README 请求。
import SwiftUI
import Alamofire
struct ContentView: View {
let readMeURL = "https://raw.githubusercontent.com/apple/swift/main/README.md"
var body: some View {
Button("Click me!") {
AF.request(readMeURL).response { response in
debugPrint(response)
}
}
}
}
关键点:
import SwiftUI提供View、Button和body。import Alamofire引入刚添加到项目的网络库。readMeURL保存 Swift 仓库 README 的原始文件地址。Button("Click me!")创建一个按钮。AF.request(readMeURL)使用 Alamofire 发起网络请求。.response接收请求结果。debugPrint(response)把响应打印到调试控制台,便于确认依赖已经链接并可用。
核心启发
-
做什么:为团队维护一份“允许使用的 Swift 包”集合。 为什么值得做:集合可以缩小选择范围,企业场景中可把开发者导向审过的包。 怎么开始:创建
input.json,把内部批准的包 URL 放入packages,用package-collection-generate生成集合,再通过内部 HTTPS 地址发布。 -
做什么:给技术文章或课程配一份依赖集合。 为什么值得做:读者打开 Xcode 后可以直接看到文章用到的包,减少复制仓库地址和选择产品的步骤。 怎么开始:把文章示例依赖写成集合,例如 Alamofire、swift-format,再在文章开头提供集合 URL。
-
做什么:为开源项目建立“推荐扩展包”入口。 为什么值得做:集合支持摘要、关键词、README URL 和版本限制,可以把配套工具和示例依赖整理成一组。 怎么开始:为每个包补充
summary、keywords、readmeURL,必要时用excludedProducts隐藏无关产品。 -
做什么:在 CI 中定期重新生成集合。 为什么值得做:生成器会按最新格式输出集合,并抓取包元数据。集合发布者不需要手动维护每个版本细节。 怎么开始:在自动化任务中运行
package-collection-generate --verbose input.json collection.json --auth-token,生成后上传到固定 URL。 -
做什么:发布签名集合给外部开发者。 为什么值得做:SwiftPM 可以展示签名者和验证结果,帮助使用者确认集合来源和内容完整性。 怎么开始:准备有效代码签名证书,运行
package-collection-sign collection.json collection-signed.json developer-key.pem developer-cert.cer,分发签名后的 JSON。
关联 Session
- Meet DocC documentation in Xcode — 用 DocC 为 Swift 包和框架生成可浏览文档。
- Host and automate your DocC documentation — 把 Swift 包文档托管到线上并接入自动化流程。
- Meet the Swift Algorithms and Collections packages — 了解 Apple 开源 Swift 包生态中的 Algorithms 和 Collections。
- What‘s new in Swift — 了解 Swift 5.5 语言、工具链和生态更新。
评论
GitHub Issues · utterances