我想以编程方式更新示例项目使用的 Swift 包的版本。
Xcode > 11 提供了一个菜单选项:
文件 > Swift 软件包 > 更新到最新的软件包版本
这将更新
Package.resolved
文件以指向特定修订版。
此文件位于:
MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
如何从 CI 构建的命令行触发此操作?
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 将根据需要简单地重新生成它。
尝试一下
xcodebuild -resolvePackageDependencies
在您的主 Xcode 项目中,项目导航器中的“包依赖项”下:
swift package update
注意: 您可以在此处了解有关 SPM CLI 的更多信息: https://github.com/apple/swift-package-manager
基于 Gregory Higley 的 answer。
我可以使用下面的脚本来更新 Xcode 项目中的包 (
.xcodeproj
)。关键是要删除两件事:
在调用
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" ...