2.4 按 Swift 版本打包
3 分钟阅读
原文链接: https://docs.swift.org/latest/documentation/packagemanagerdocs/swiftversionspecificpackaging/
2.4 按 Swift 版本打包
为特定 Swift 版本提供包清单。
概述
包管理器支持同时适配多种版本的包:既包括语言版本,也包括提供包管理器的 Swift 工具链版本。
对于与语言相关的版本检查,请使用源代码中可用的语言版本检查。不过在某些情况下,这种做法会变得难以维护,特别是当包清单无法与版本无关时——例如你在包清单中采用了旧版本不具备的新特性。
包管理器支持一种机制:让特定版本的清单与当前清单并存,以支持较旧版本的 Swift。
特定版本清单的选择
加载某个特定版本的包时,包管理器会通过查找形如 Package@swift-6.swift 的清单,来寻找带版本标记的清单版本。版本是一个宽松指定的语义化版本,按下列优先级顺序解析:
MAJOR.MINOR.PATCH(例如Package@swift-6.1.1)MAJOR.MINOR(例如Package@swift-6.1)MAJOR(例如Package@swift-6)
当某个清单文件与另一个 Swift 项目版本存在实质差异、却仍要维持兼容时(例如清单 API 发生变化),就可以使用这一特性。
如果当前的 Swift 版本不匹配任何特定版本的清单,包管理器会选择工具版本最兼容的那个清单。例如,如果有三个清单:
Package.swift(工具版本 6.0)Package@swift-5.10.swift(工具版本 5.10)Package@swift-5.9.swift(工具版本 5.9)
在 Swift 6 及更高版本上,包管理器会选择 Package.swift,因为它的工具版本与包管理器的未来版本最兼容。使用 Swift 5.10 时,它会选择 Package@swift-5.10.swift;否则在使用 Swift 5.9 时,它会选择 Package@swift-5.9.swift,而这也是该包能够使用的最低工具版本。
一个包可以带有带版本的清单文件,其工具版本高于不带版本的 Package.swift。在这种情况下,包管理器会使用与最新兼容工具版本相对应的清单。
注意:在该特性刚引入时,之所以需要支持"带版本的清单文件具有更新的工具版本",是因为旧版包管理器并不知道这个概念,只会去寻找不带版本的
Package.swift。这一行为至今仍然支持,但自该特性引入以来 Swift 已经发布了多个版本。最佳实践是让Package.swift声明所支持的最新工具版本,而带版本的清单文件只用于指定较旧的版本。
解析远程依赖时使用的特定版本标签
定义包版本的标签可以带上形如 @swift-3 的标记作为后缀。当包管理器确定某个仓库的可用标签时,如果存在与当前工具版本匹配的版本标记,它就只考虑带该版本标记的版本;反过来,版本标记不匹配的工具版本会忽略这些标签。
例如,假设包 PlayingCard 有标签 1.0.0、1.2.0@swift-5 和 1.3.0。如果包管理器来自 Swift 工具链 5.0,在评估该包的可用版本时,它只考虑版本 1.2.0。同样的情况下,使用 Swift 6 或更高版本则只尝试解析版本 1.0.0 和 1.3.0。
这一特性适用于下列场景:
某个包希望旧版本继续支持 Swift 3.0,但较新的版本要求 Swift 4.0 才能读懂清单。由于 Swift 3.0 不会忽略这些版本,如果不做处理,它在解析该包依赖时就会失败。此时作者可以给最后几个支持 Swift 3.0 的版本重新打上合适的标签。
某个包希望在同一批版本号上同时支持 Swift 3.0 和 Swift 4.0,但这要求代码有较大差异。此时作者可以分别维护两套并行的标签。
除非为了支持已有客户端而绝对必要,并不期望包使用这一特性。具体来说,包不应在支持最新已发布 Swift 版本的标签上采用这种语法。包管理器支持按下列优先级顺序寻找带标记的标签:
MAJOR.MINOR.PATCH(例如1.2.0@swift-3.1.2)MAJOR.MINOR(例如1.2.0@swift-3.1)MAJOR(例如1.2.0@swift-3)