如何从命令行触发 Xcode 的“更新到最新包版​​本”?

Joe*_*ick 11 xcode continuous-integration swift swift-package-manager

目标:

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

问题:

Xcode > 11 提供了一个菜单选项:

文件 > Swift 包 > 更新到最新的包版本

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

该文件位于:

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

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

Gre*_*ley 7

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

我发现可靠地执行此操作的唯一方法是删除DerivedDataXcode 项目的整个子文件夹。

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
Run Code Online (Sandbox Code Playgroud)

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


jos*_*ons 5

试用 xcodebuild -resolvePackageDependencies

  • 这与“更新到最新的包版本”的作用不同——它只是确保本地缓存与当前的预期相匹配。 (4认同)

Joe*_*ick -5

最终放弃了这条路线,因为理想情况下 CI 测试存储库中的内容不是存储库中的内容。

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

它有点 hacky,但提供了有关合并后如何使用包的准确反馈。

更新: 能够找到更好的解决方案。 /sf/answers/4277744691/