WWDC Quick Look 💓 By SwiftGGTeam
Discover and curate Swift Packages using Collections

Discover and curate Swift Packages using Collections

观看原视频

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 提供 ViewButtonbody
  • 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 和版本限制,可以把配套工具和示例依赖整理成一组。 怎么开始:为每个包补充 summarykeywordsreadmeURL,必要时用 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

评论

GitHub Issues · utterances