Xcode Cloud执行Archive归档时因Swift Package报错如何解决
Xcode Cloud 构建集成GEOSwift的项目归档阶段报错修复
问题复现特征
- 项目通过Swift Package Manager集成GEOSwift依赖
- 配置Xcode Cloud工作流实现TestFlight构建、归档、发布全流程自动化
- 构建流程执行到收尾归档阶段固定报错,错误核心提示为找不到GEOSwift对应的可构建产品目标
- 本地构建完全正常,执行删除Derived Data、清理项目、移除后重新添加Swift Package等常规排查操作后,云端报错仍复现
问题根因
这个是Xcode Cloud处理带C语言底层依赖的Swift Package时的已知逻辑缺陷:GEOSwift依赖的纯C实现的geos底层库,不会被Xcode Cloud的归档流程自动识别为需要参与构建的目标。你之前尝试的所有清理类操作都只作用于本地构建环境,完全无法影响Xcode Cloud的云端构建环境和默认的Swift Package校验逻辑,自然无法解决问题。
修复步骤
- 修正依赖关联配置
打开项目的Swift Package依赖列表,找到GEOSwift和它关联的geos底层库产品,手动将两个产品的Target Membership都勾选为你的主App Target,嵌入规则选择Do Not Embed(GEOSwift是静态链接库,不需要动态嵌入,选嵌入反而会触发App Store提交的签名报错)。 - 添加Xcode Cloud前置构建脚本
在项目根目录新建ci_scripts文件夹,在文件夹内创建名为ci_post_clone.sh的脚本,写入以下内容:
打开终端进入#!/bin/sh set -e # 关闭Xcode Cloud对SPM产品的自动目标校验,解决底层C库识别失败问题 defaults write com.apple.dt.Xcode IDEPackageDisableAutoProductTargetValidation -bool YES # 提前解析依赖,触发所有关联目标的构建配置生成 xcodebuild -resolvePackageDependencies -scheme "$CI_XCODE_SCHEME" -destination generic/platform=iOSci_scripts目录,执行chmod +x ci_post_clone.sh给脚本添加可执行权限,把整个ci_scripts文件夹提交到代码仓库。 - 调整归档阶段构建设置
打开Xcode Cloud工作流的编辑页面,找到归档阶段的构建配置项:- 将
Build Libraries for Distribution设置为No - 将
Dead Code Stripping设置为Yes - 不要勾选主Target的
Skip Install选项
- 将
- 清空缓存重跑构建
在Xcode Cloud工作流设置里选择清理历史构建缓存,重新触发构建流程即可。
避坑提示:不要把GEOSwift依赖添加到自定义Framework子Target再间接给主App Target链接,Xcode Cloud对嵌套依赖的静态Swift Package的归档识别存在额外问题,直接关联主App Target是稳定性最高的方案。
内容的提问来源于stack exchange,提问作者narner
相关产品推荐
相关产品推荐

