iOS 打包服务器磁盘不够?2026 Xcode 27 清理还是扩容

这篇文章面向维护远程 iOS 打包服务器的独立开发者和小型团队。你将按构建缓存、模拟器组件、依赖缓存与发布产物分层排查磁盘压力,并根据单 App、多项目和持续测试场景决定清理、扩容还是拆分远程 Mac。

iOS 打包服务器磁盘不够?2026 Xcode 27 清理还是扩容

目录

远程 Mac 正在执行 Archive,突然提示磁盘空间不足;源码、证书和账号都没有异常,任务却在构建中途失败。

最快的处理方式不是立刻扩容,也不是执行一条命令全盘删除,而是先把占用分成构建缓存、模拟器组件、依赖缓存和发布产物,再决定清理、保留或增加独立主机。

这篇文章适合只有一台远程 Mac、近期频繁收到磁盘告警的独立开发者;也适合需要同时维护 Xcode 27、多个 Simulator Runtime 和历史 Archive 的小团队。如果你还要运行持续 UI 测试或多个 App 的自动化发布,可以直接看后面的场景决策部分。

本周建议动作:先定位对象,再执行回收

本周时间表 你要做什么 停止条件
第一步 确认当前没有 Build、Test、Archive、导出或上传任务 任务仍在运行时不删除任何构建目录
第二步 记录磁盘总量、可用空间,以及各类目录的归属 无法确认目录属于哪个项目时先保留
第三步 优先处理可再生的 DerivedData、临时构建输出和不再使用的组件 删除后无法说明如何重新生成时停止
第四步 复核依赖能否从锁定文件和可靠来源恢复 私有依赖或离线依赖无法恢复时不清理
第五步 对 xcarchive、dSYM、xcresult 和 IPA 做替代来源验收 没有备份或重新构建链路时不删除发布证据

Xcode 的构建系统会根据项目文件、目标、Scheme 和构建设置组织编译任务;它不是简单地把所有输出都当作缓存处理。你需要先知道某个目录是中间产物、最终产物,还是后续故障排查所需的证据。Apple 的 Xcode Build System 文档对此有明确说明。

两种打包服务器的清理容忍度不同

使用方式 可以优先检查的对象 不应直接删除的对象 建议
只做 Release Archive 和上传 旧 DerivedData、已验收的临时输出、不再使用的 Simulator Runtime 当前发布所需的 xcarchive、dSYM、签名资产 先建立发布产物归档,再做定向清理
需要增量编译、调试和 SwiftUI Preview 项目级旧缓存、已废弃的测试结果、明确不用的模拟设备数据 正在使用的 DerivedData、当前 Scheme 依赖、测试证据 低风险分批清理,保留回退路径
多 App、多 Xcode 版本并行 已确认归属的项目缓存、停用版本对应的组件 仍被其他项目引用的工具链和依赖 按项目与 Xcode 版本建立归属
持续 UI 测试和多系统回归 不在测试矩阵中的运行时和设备 测试矩阵要求的 Runtime、设备数据和结果 先精简测试矩阵,再考虑扩容或拆机

第一种场景:Xcode 27 打包机磁盘满了,先清理什么

如果失败发生在 Archive、导出或上传前,第一步不是看目录名称,而是确认任务状态。通过终端、CI 日志或远程控制台确认没有 xcodebuild、测试进程、导出任务和上传任务仍在写入目标目录;否则即使删除的是缓存,也可能造成当前任务无法完成,甚至留下不完整的发布产物。

DerivedData 可以定期清理,但不能把它当成所有输出

DerivedData 用来放置由 Xcode 构建过程产生的派生文件。Apple 的构建设置文档还区分了配置相关的构建目录、临时目录、派生文件目录和构建产品路径,因此你不能看到一个目录很大,就推断里面全部都可以删除。Apple Build Settings Reference提供了这些路径和设置的定义。

远程打包服务器可以采用以下边界:

Apple 的命令行示例说明,指定 -derivedDataPath 可以让自动化脚本更容易识别构建输出;同时,构建过程会在该路径中产生多个文件。Apple 的 xcodebuild 派生数据示例可以作为你设计项目级输出目录的参考。

如果你需要执行清理命令,先把作用范围写进脚本注释,并保留项目名称、Xcode 版本、Scheme 和执行时间。不要把“清理 DerivedData”写成没有项目边界的全局删除任务。

第二种场景:模拟器运行时和设备数据要分开处理

模拟器占用空间时,最容易出现的误判是把 Simulator Runtime、已创建的模拟设备、应用数据、截图和测试结果全部称为“模拟器缓存”。这些对象的恢复方式和保留理由并不相同。

Apple 允许你在 Xcode 的 Components 设置中管理平台支持、可选组件和不同系统版本的 Simulator Runtime,并显示删除组件后可以回收的空间。Apple 的组件管理文档说明了如何安装、停用和删除这些组件。

只做 Archive 的远程 Mac,可以不承担完整模拟器职责

如果这台 Mac 的唯一任务是 Release Archive、签名和上传,那么你可以把模拟器职责移到另一套开发或测试环境。保留完整测试矩阵会增加工具链维护复杂度;但删除前必须确认没有 UI 测试、截图生成、启动验证或回归任务依赖这些 Runtime。

如果项目需要多系统回归,建议按测试矩阵建立清单:

  1. 记录每个测试任务使用的系统版本和设备型号。
  2. 标记只用于历史回归、近期没有任务调用的 Runtime。
  3. 先在非生产任务上验证删除后的测试命令。
  4. 保留能覆盖当前发布阻塞问题的必要 Runtime。
  5. 删除后重新运行一条代表性 UI 测试,再决定是否继续回收。

模拟器不能替代实体设备。Apple 明确提醒,模拟器不完全复制真实设备的性能和硬件特性;涉及真实硬件能力时,仍需要在实体设备上验证。Apple 的模拟器与实体设备说明是你制定保留边界时应引用的依据。

因此,“只保留模拟器、不做实体设备验证”不是可靠的磁盘治理方案。它可能暂时释放空间,却把发布风险转移到了测试阶段。

第三种场景:多项目依赖缓存不能一键全删

当一台远程 Mac 同时服务多个 App 时,磁盘压力往往不只来自 Xcode。Swift Package Manager、CocoaPods、私有依赖、多个工作区以及不同 Xcode 版本,可能分别生成自己的解析结果和构建输出。

这时你需要为每个项目建立最小归属信息:

清理依赖缓存必须通过冷构建验收

不要把“重新解析依赖成功”当作“项目可以发布”。依赖能够下载,只代表解析阶段通过;它并不证明编译、签名、Archive 和导出链路都能恢复。

建议按下面的连续证据链操作:

  1. 在清理前保存当前项目的锁定文件和构建日志。
  2. 对目标项目单独执行依赖解析,不要同时改动其他项目。
  3. 完成一次冷构建,确认所有目标和私有依赖都能编译。
  4. 执行一次 Release Archive,检查签名和嵌入内容。
  5. 用项目原有的导出配置完成导出,必要时再验证上传。

Xcode 的 Scheme 决定 Build、Run、Test 和 Archive 使用哪些目标、配置和环境;因此,同一个工作区中不同 Scheme 不能共用一套没有归属的清理规则。Apple 的 Scheme 配置文档对此有具体说明。

第四种场景:xcarchive、IPA、dSYM 和 xcresult 的保留边界

发布产物不应该和缓存放进同一条删除规则。它们分别服务于重新导出、上传追溯、崩溃符号化和测试排查。

文件或目录 主要用途 清理前必须确认 可回退来源
xcarchive 保存 Archive 内的应用二进制和相关发布信息 是否仍需重新导出、追溯某次发布或排查崩溃 可靠的归档存储,或可重复生成的完整 Archive
IPA 已导出的分发包 是否仍用于审核追溯、内部测试或重新上传 已验证的 Archive 和导出配置
dSYM 将崩溃地址还原为符号和代码位置 是否对应已分发版本 与该构建 UUID 匹配的 Archive 或独立符号备份
xcresult 保存测试会话、日志、覆盖率和其他测试结果 是否仍在处理测试失败或审计回归 CI 产物存储或可重新执行的测试任务
上传日志 记录上传、签名或服务器返回信息 是否需要追踪发布失败 CI 日志、App Store Connect 记录或本地归档
临时构建输出 服务于当前构建过程 是否有任务正在使用 重新构建

Apple 明确说明,Archive 会收集应用二进制和 dSYM 文件;对于已经分发的构建,应保留对应 Archive,否则后续崩溃排查可能缺少必要信息。Apple 的调试符号文档是保留 dSYMxcarchive 的直接依据。

测试结果也不能简单当成日志垃圾。使用 xcodebuild test 时,Xcode 会生成 .xcresult,其中可以包含测试会话、覆盖率和日志;正在排查某次失败时,删除它会减少可复核证据。Apple 的测试结果文档说明了 .xcresult 的内容和用途。

⚠️ 注意:如果你无法回答“删除后如何重新导出同一个版本、如何恢复对应 dSYM、如何重现这次失败”,就不要把该文件放进自动清理任务。

发布产物的最小恢复验收

在回收远程 Mac 磁盘前,至少逐项确认:

如果你需要从 Archive 重新导出,Apple 官方流程使用 xcodebuild -exportArchive,并要求指定 Archive、导出配置和输出路径。Apple 的 Archive 导出说明可以作为自动化脚本的参考。

第五步:用条件分支决定继续清理、扩容还是拆分

下面这组判断适合放进你的运维文档,而不是只靠临时经验做决定:

场景评分 清理策略 扩容策略 拆分远程 Mac
低频单 App、主要做 Archive ★★★★☆ ★★☆☆☆ ★☆☆☆☆
多 Xcode 版本、少量手工测试 ★★★☆☆ ★★★★☆ ★★★☆☆
多 App、持续自动化发布 ★★☆☆☆ ★★★★☆ ★★★★★
高频 UI 测试和多系统回归 ★★☆☆☆ ★★★★☆ ★★★★★
阶段性发版高峰 ★★★☆☆ ★★★☆☆ ★★★★★

评分不是性能测试,而是维护复杂度判断:星级越高,说明该方案越符合对应场景。真正执行前,仍要以你的目录占用、任务并发方式、依赖恢复能力和发布证据为准。

扩容判断应放在哪个节点

当磁盘告警反复出现,并且占用对象已经被正确分类,说明问题可能已经从“缓存治理”变成“工作负载边界”。尤其是以下情况,不建议继续用删除文件来掩盖容量不足:

扩容适合“同一套任务长期稳定运行,但现有空间边界不足”的情况。拆分更适合“不同任务需要不同工具链、权限、运行时或稳定性边界”的情况。若只在某个版本验证周期短期增加需求,增加一台独立远程 Mac 往往比在唯一生产打包机上反复安装、删除和迁移更容易回退。

你可以先查看 VPSMAC 的远程 Mac 方案,再根据项目所在地和访问链路选择合适的节点说明,例如 M4 远程 Mac 节点配置。决策重点应放在独立环境是否能隔离当前打包机、是否方便恢复,以及租期是否覆盖你的验证周期,而不是只看一项磁盘容量。

最后判断:清理是治理,扩容是边界,拆分是隔离

对低频单 App 来说,先把 DerivedData、模拟器组件、依赖缓存和发布产物分开,通常比直接增加空间更合理;但对多项目、持续测试和频繁发布环境,单纯清理会把维护风险推迟到下一次 Archive。

你当前方案如果把开发、测试、签名、Archive 和上传都放在唯一一台 Mac 上,通常会有几个真实缺点:清理时容易误伤正在运行的任务;多个 Xcode 版本会互相增加维护负担;历史产物和测试证据缺少独立保存边界;发版高峰还可能让所有项目同时争用同一台主机。

如果你的需求是阶段性的版本验证、临时发版高峰或需要额外的 iOS 打包服务器,租用 VPSMAC 的独立远程 Mac 会比继续压缩唯一生产主机的空间更容易控制风险。你可以保留原有环境不动,把新项目或短期任务放到独立主机上,完成一次 Archive、导出和恢复验收后,再决定是否长期扩容或拆分。