Swift Package Index 构建系统
- 什么是 Swift Package Index 构建系统?
- 为什么 package 显示缺失或不完整的兼容性?
- 默认分支为哪个修订版本构建?
- Package 如何构建?
- 构建系统如何使用不同的 Swift 版本进行构建?
- Package 上次构建是什么时候?
- 是否可以隐藏不受支持平台的失败构建?
- 如果构建显示错误失败,我该如何修复?
- 如果构建显示与构建无关的错误,我该如何修复?
- 当依赖项无法解析时,我该如何诊断问题?
- 什么是数据竞争安全性,以及如何测试它?
什么是 Swift Package Index 构建系统?
Swift Package Index 的 Swift 版本和平台兼容性数据基于我们构建系统的真实结果。该构建系统支持所有 Apple 平台(iOS、macOS、watchOS、tvOS)和 Linux,提供全面、经过验证的真实世界兼容性信息。
Swift Package Index 不断轮询每个 package 以查找更改和新版本。每当它看到更改时,它都会跨全面的 Swift 版本和平台集编译代码。例如,查看 SnapKit 的 package 兼容性报告,SnapKit。
注意: 构建系统检查每个版本的兼容性,无论频率多高,而系统最多每 24 小时构建一次 package 的默认分支。如果在同一天内默认分支有更新,则新的兼容性检查会在 24 小时超时到期后开始。
为什么 package 显示缺失或不完整的兼容性?
Swift Package Index 将自动获取新的默认分支修订版本和版本发布。提交或新版本发布后,构建结果可能需要一段时间才能可用,因此如果兼容性矩阵显示时钟符号,则表示构建仍在等待中,结果即将到来!
默认分支为哪个修订版本构建?
Swift Package Index 目前不显示默认分支跟踪的修订版本。如果默认分支修订版本在几个小时前已更改,则一切都应是最新的。如果看起来构建在几个小时后没有更新的问题,请提出问题。
Package 如何构建?
构建系统根据平台和指定的 Swift 版本运行 xcodebuild
或 swift build
。
运行 xcodebuild
时,我们应用一些启发式方法来查找要构建的正确 scheme。如果 package 包含单个 scheme(如 xcodebuild -list
报告的那样),则构建系统将使用该 scheme。如果 xcodebuild -list
报告多个 scheme,则构建系统将选择以 -Package
结尾的 scheme。否则,它将尝试删除任何 Xcode 项目和工作区文件,并依靠 SPM 的 scheme 发现来自动生成 package scheme。
构建系统如何使用不同的 Swift 版本进行构建?
构建系统的目标是尽可能重现构建 package 的真实世界环境。理想情况下,如果 Swift Package Index 表示它与 Swift 5.1 兼容,并且您的项目使用 Swift 5.1,则它应该可以工作。对于我们来说,最真实世界的构建方式是使用多个不同版本的 Xcode 来处理每个 package。我们默认使用随我们要编译的 Swift 版本发布的最新的可用 Xcode 版本。
为了找出哪个 Xcode 版本对应于 Swift 版本,请参阅 swiftversion.net。我们还在每个单独构建的详细信息页面上将其显示为构建命令的一部分。
构建系统使用 DEVELOPER_DIR
环境变量来切换 Xcode 版本。这适用于 xcodebuild
和 swift build
命令。
Package 上次构建是什么时候?
Swift Package Index 目前不显示 package 上次构建的日期/时间,但通常在修订版本或版本发布后几个小时内一切都会更新。
是否可以隐藏不受支持平台的失败构建?
目前没有。但是,通过在兼容性矩阵中使用灰色而不是红色,我们的目标是表明这是缺少平台或 Swift 版本支持,而不是失败本身。在构建详细信息页面上,我们显示带有红色叉号的状态,以便 package 维护者更容易找到和检查可能存在的真正问题。
如果构建显示错误失败,我该如何修复?
作为 package 作者,您可能会认为 package 应该与平台或 Swift 版本兼容,而 Swift Package Index 显示它不兼容。首先,请尝试使用构建系统使用的构建命令在本地复制构建。构建详细信息页面显示完整的构建命令,这将有助于揭示 package 设置或我们发现构建 scheme 的方式是否存在问题。
如果您可以解决问题,那就太好了!修复问题,推送更改,我们将重新处理您的构建。如果问题更严重,请提出问题,以便我们改进构建系统。
如果构建显示与构建无关的错误,我该如何修复?
在某些情况下,我们可能遇到了与您的 package 无关的构建问题。请使用构建详细信息页面上显示的构建命令确认您可以针对给定的 Swift 版本和平台成功构建您的 package。如果成功,请提出问题,以便我们可以删除有故障的构建并安排重新构建。
当依赖项无法解析时,我该如何诊断问题?
如果您在构建详细信息页面上遇到以下错误
xcodebuild: error: Could not resolve package dependencies:
unknown package 'foo' in dependencies of target 'Bar'; valid packages are: 'baz', 'baq'
可能的原因是本地 package 依赖项(例如,导入 package 的示例项目),其中 package 依赖项声明为
.package(path: "../../")
在这种情况下,由于 Xcode 猜测 package 名称的方式,它无法解析 package 依赖项。要解决此问题,请在您的依赖项子句中指定 package 名称,如下所示
.package(name: "foo", path: "../../")
您可以在此问题中找到更多详细信息。
什么是数据竞争安全性,以及如何测试它?
Swift 6.0 编译器可以在启用“完整”并发检查的情况下,在编译时检查代码是否免受数据竞争的影响。我们在 package 页面上发布的数据竞争安全性信息来自我们在构建每个 package 时编译器输出的诊断信息。
无法区分真正没有数据竞争安全错误的 package 和在代码中抑制错误的 package。我们在页面上显示的数字是编译器报告的数据竞争错误的数量。
请注意,这不会影响 package 兼容性,如兼容性矩阵中所示。package 可以完全兼容 Swift 6.x,而无需启用严格的并发检查,前提是它不在 Swift 6 语言模式下运行。有关选择加入 Swift 6 语言模式的更多信息,请阅读 Swift 6 迁移指南以获取更多信息。
注意: 如果您看到 Swift Package Index 报告的数据竞争安全错误数量与您在本地测试中看到的数量不一致,我们正在跟踪 Swift 编译器报告的幻象数据竞争错误的潜在问题。请随时在该问题的线程中注明可能受影响的 package。