如何清理 Xcode,又不误删发布归档
Xcode 会把存储分散在构建输出、索引、归档、设备支持、模拟器设备和可下载平台运行时中。有些内容可以重新生成,有些却可能是已发布版本归档和 dSYM 的唯一副本。
安全做法是分别测量每一类,能通过 Xcode 移除时就使用 Xcode,并保留与已发布构建相关的产物。
Xcode 的几十 GB 都去了哪里
先查看两个主要用户级目录:
du -sh ~/Library/Developer/Xcode/* ~/Library/Developer/CoreSimulator 2>/dev/null | sort -h
最常见的大项目包括:
- DerivedData: 构建产物、索引和模块缓存,通常每个项目有一个目录。它可以重建,但全部清空会让之后的索引和构建成本很高。先处理已经不用的项目。
- DeviceSupport: 从物理设备与特定系统构建收集的符号和支持数据。旧项目仍可能用于崩溃符号化。
- Archives: 每次导出或发布应用时保存的构建。Apple 建议保留每个已分发构建的归档,因为其二进制文件和匹配 dSYM 可能用于分析之后收到的崩溃报告。只存在于本机、从未分发的构建,更适合清理。
- 模拟器设备与平台运行时: 设备位于 CoreSimulator 中,可下载运行时由 Xcode 组件管理。两者不是同一种缓存。
怎样分别安全清理
DerivedData 最适合按项目处理。退出 Xcode,通过「Xcode > 设置 > 位置」显示 Derived Data,找出已经不用的项目目录,再把该目录移到废纸篓。只有全局索引或构建问题确实需要付出重建成本时,才全部清空。
不可用模拟器设备有专门命令:
xcrun simctl delete unavailable
它会删除对应运行时已经不可用的设备记录,不会卸载运行时镜像本身。通过「Xcode > 设置 > 组件」查看已安装平台和模拟器运行时,以及可以回收的大小,再移除能够重新下载的运行时。Apple 的 Xcode 组件说明介绍了同一条受管理的移除路径。设备记录则在「窗口 > 设备与模拟器」中管理。
归档应在「窗口 > Organizer」中检查。每个已经分发的构建,包括仍有用户使用的旧生产版本,都应保留归档和 dSYM。Apple 的调试信息说明指出,二进制文件与 dSYM 只有在构建 UUID 匹配时才能一起工作。DeviceSupport 同样适合选择性检查,不适合整体清空。
移动 DerivedData 前退出 Xcode,避免索引和构建数据库正处于写入状态。下一次打开和构建时,Xcode 会重新索引、解析依赖并生成输出,所需时间取决于项目以及仍然可用的本地内容。
为什么 DerivedData 可以重建,DeviceSupport 却不同
DerivedData 是可重现的构建和索引输出。Xcode 会为每个项目创建一个以项目路径哈希命名的目录,再写入根据源代码、设置、工具链和依赖生成的目标文件、模块缓存、索引与构建产物。删除后,只要输入仍然存在,Xcode 就能重建,代价是时间和可能的网络访问。
DeviceSupport 在性质上不同。调试物理设备时,Xcode 会保存该系统构建的支持和符号数据。模拟器设备与运行时镜像也是彼此独立的受管理对象,不是普通缓存目录。
归档最值得选择性保留,因为其中包含符号化 App Store 构建崩溃报告所需的 dSYM。能区分可重建缓存与捕获产物,就是安全清理和应该保留之间的全部边界。
先用磁盘地图找出最大类别
Mole「分析」页这样的磁盘地图,可以显示空间压力主要来自 DerivedData、CoreSimulator 还是 Archives。移除操作仍应交给 Xcode 的「组件」「设备」和 Organizer,因为这些入口理解运行时、设备和发布产物。
清理时按这个顺序
停止正在运行的构建,分别测量 Xcode 与 CoreSimulator。按项目删除过期 DerivedData,删除不可用模拟器设备,再从「组件」卸载不再使用的运行时。删除归档前,把它与已发布版本和符号化需要进行核对。
重新打开一个重要项目并完成一次构建,确认正常后再清空废纸篓。