如何对 swift 包进行版本控制

Posted

技术标签:

【中文标题】如何对 swift 包进行版本控制【英文标题】:How to version swift packages 【发布时间】:2021-02-22 07:31:43 【问题描述】:

使用 Xcode 12.4 和 Swift 5.3 我使用 Package.swift 清单文件定义了一个包。将其包含在应用程序中后,我想更新软件包。为此,我更改了新版本的链接并更新了校验和;文件的相关部分如下所示:

let package = Package(
    name: "MyPackage",
    // omitted platforms and products
    targets: [ .binaryTarget( name: "MyPackage",
                              url: "https://artifactory/mypackage-v1.1.zip",
                              checksum: "..." ) ] )

但是,我收到错误消息artifact of binary target 'MyPackage' has changed checksum; this is a potential security risk so the new artifact won't be downloaded。通过删除文件夹上的整个DerivedData 可以忽略此错误,但这显然不是更新版本号。 this answer 中提出了另一种解决方案,但同样不影响版本控制。 official documentation 写了大量关于依赖包版本的文章,但我找不到如何指定 CURRENT 包的版本。

如何合法地指定和更新版本号,以便将新工件识别为不同的新版本并正确下载?

【问题讨论】:

我的理解是,“版本”是 URL,你需要一个有效的元组:(content_of_the_URL, checksum)。您是否按照此处指定的方式创建了校验和:Declare a Binary Target in the Package Manifest? 在 SPM 版本中不是用 git repo 上的标签管理的吗? developer.apple.com/documentation/xcode/… @CouchDeveloper,这是有道理的。但是,更改 URL 和校验和会导致上述错误消息。 @Lame,这将是一种相当奇怪的方式来指定版本号。另外,如果版本号在工件内部,它显然不起作用,因为 Xcode 一开始就拒绝下载该工件。 包版本被指定为您推送的提交上的标签。 【参考方案1】:

当您想使用xcframework 文件分发(私下或公开)封闭源代码包时,您通常需要创建一个仅包含Package.swift 文件的git 存储库,您在其中声明binaryTarget。 (或 binaryTargets)任何有权访问此存储库的人也应该有权访问您在 binaryTarget 中声明的 url 以安装您的包。

正如 @Larme 和 @matt 在 cmets 中正确提到的那样,要指定哪个提交对应于每个版本,您必须在 git 存储库中使用标签,就像在 cocoapod 存储库中一样,只有您会在存储库中这样做 Package.swift 文件。有关详细信息,请参阅 Publishing a Swift Package with Xcode 文档中的“标记您的最新提交”部分。

您可以使用 PSPDFKit 作为示例,它是一个已知且维护良好的封闭源代码包,可以使用 this github 存储库进行安装。

【讨论】:

它必须是一个单独的 Git 存储库?我不能将 KMM(kotlin 多平台)存储库与名为 swiftpackage 的子文件夹一起使用吗? @IgorGanapolsky 您可以使用现有的存储库来实现此目的,但您必须确保 Package.swift 清单文件位于存储库的根目录中。您可以在测试 Xcode 项目中使用 file://<absolute_path_to_your_repo> 作为包存储库 URL 在本地测试您的配置(无需推送您的提交),以查看一切是否按预期工作。

以上是关于如何对 swift 包进行版本控制的主要内容,如果未能解决你的问题,请参考以下文章

如何开始对作曲家包进行版本控制?

应该如何对相互关联的软件包进行版本控制?

dotnet 核心包版本控制

使用 Github 进行 pypi 包版本控制

使用Laravel的语义版本控制进行包版本控制

从基于日期的版本控制切换到语义版本控制后,如何防止 NuGet 升级包?