如何对 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 包进行版本控制的主要内容,如果未能解决你的问题,请参考以下文章