如何从命令行触发 Xcode 的 'Update to Latest Package Versions'?

How to trigger Xcode's 'Update to Latest Package Versions' from command line?

目标:

我想以编程方式更新示例项目使用的 Swift 个包的版本。

问题:

Xcode > 11 提供菜单选项:

File > Swift Packages > Update to Latest Package Versions

这将更新 Package.resolved 文件以指向特定修订版。

此文件位于:

MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

如何从命令行为 CI 构建触发此操作?

最终放弃了这条路线,因为理想情况下 CI 测试 GOING 在 repo 中的内容而不是 IS 中的内容回购协议。

最终解决方案是指向一个虚拟分支,然后强制将 CI 生成的合并提交推送到该分支。

它有点老套,但提供了有关如何使用包的准确反馈post-merge。

更新: 能够找到更好的解决方案。

试用xcodebuild -resolvePackageDependencies

xcodebuild -resolvePackageDependencies 似乎不能可靠地工作。它通常会顽固地拒绝更新到最新版本,特别是当 SPM 依赖项指向分支而不是版本标记时。显然 Xcode 正在某处缓存此信息,但我无法弄清楚它到底是哪个文件。即使核对派生数据中的 SourcePackages 文件夹也没有成功。

我发现可靠地执行此操作的唯一方法是核对 Xcode 项目的整个 DerivedData 子文件夹。

derived=$(xcodebuild -showBuildSettings | grep -m 1 BUILD_DIR | grep -oE "\/.*" | sed 's|/Build/Products||')
# The above will return a folder with a name like /Users/you/Library/Developer/Xcode/DerivedData/MyProject-ehdkocavaenextdcrsaszjdmyssx
rm -rf "$derived"
xcodebuild -resolvePackageDependencies

删除项目的 DerivedData 子文件夹是完全安全的。 Xcode 将根据需要简单地重新生成它。

如果您将规则设置为下一个次要版本并且下一个版本是主要版本,则单击更新将不起作用,您必须更改程序包设置。