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

问题描述 投票:0回答:6

目标:

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

问题:

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

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

这将更新

Package.resolved
文件以指向特定修订版。

此文件位于:

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

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

swift xcode continuous-integration swift-package-manager
6个回答
9
投票

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 将根据需要简单地重新生成它。


8
投票

尝试一下

xcodebuild -resolvePackageDependencies


2
投票

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

enter image description here


1
投票

在您的主 Xcode 项目中,项目导航器中的“包依赖项”下:

  • 选择您要更新的依赖项
  • 右键单击>在Finder中打开(这是在派生数据下)
  • 在终端中打开此位置
  • 运行命令:
    swift package update

注意: 您可以在此处了解有关 SPM CLI 的更多信息: https://github.com/apple/swift-package-manager


0
投票

基于 Gregory Higley 的 answer

我可以使用下面的脚本来更新 Xcode 项目中的包 (

.xcodeproj
)。关键是要删除两件事:

  1. 项目衍生数据
  2. 包已解决

在调用

xcodebuild
命令之前。你不需要
xcodebuild -resolvePackageDependencies
xcodebuild build ...
将自动解决包依赖关系。

PROJECT="..." # Your project Foo.xcodeproj path

# == Update Package ==
echo "Update Package..."

# remove derived data
DERIVED_DATA_PATH=$(xcodebuild -showBuildSettings | grep -m 1 BUILD_DIR | grep -oE "\/.*" | sed 's|/Build/Products||')
if [ -d "$DERIVED_DATA_PATH" ]; then
  echo "Remove derived data: $DERIVED_DATA_PATH..."
  rm -rf "$DERIVED_DATA_PATH"
fi

# remove Package.resolved
PACKAGE_RESOLVED="$PROJECT/project.xcworkspace/xcshareddata/swiftpm/Package.resolved"
if [ -f "$PACKAGE_RESOLVED" ]; then
  echo "Remove Package.resolved: $PACKAGE_RESOLVED..."
  rm -f "$PACKAGE_RESOLVED"
fi
# == Update Package [END] ==

xcodebuild build -project "$PROJECT" -scheme "$SCHEME" ...

-5
投票

最终放弃了这条路线,因为理想情况下 CI 测试存储库中的“GOING”,而不是存储库中的“IS”。 最终的解决方案是指向一个虚拟分支,然后强制将 CI 生成的合并提交推送到该分支。 这有点 hacky,但提供了有关合并后如何使用包的准确反馈。

更新:

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

https://stackoverflow.com/a/61110638/2565025

© www.soinside.com 2019 - 2024. All rights reserved.