AskClean问净

安全删除 Xcode DerivedData 与开发者缓存

AskClean 团队 · 更新于 2026-11-02

DerivedData 是 Xcode 存放构建产物和索引的临时工作文件夹,会悄悄长到几十 GB。它可以放心删除:先退出 Xcode,再清空 ~/Library/Developer/Xcode/DerivedData 里的内容,下次构建时 Xcode 会全部重建。本指南讲清这一步,也覆盖模拟器、归档和包管理器缓存。

安全删除 Xcode DerivedData 与开发者缓存
Xcode DerivedData 可以放心删除:先退出 Xcode 再清空文件夹,下次构建会自动重建。本文还讲清如何清除旧模拟器运行时,以及如何安全处理归档、DeviceSupport 设备支持文件和 SwiftPM、npm、Homebrew 等包管理器缓存。

DerivedData 是什么,为什么会这么大

DerivedData 存放的是 Xcode 从你的源代码“派生”出来的一切:中间构建对象、编译产物、模块缓存、供代码补全和跳转到定义使用的符号索引,以及构建日志。它默认位于 ~/Library/Developer/Xcode/DerivedData,你打开过的每个项目或工作区各占一个子文件夹。

它会膨胀,是结构使然:你每打开一个项目,Xcode 就为它建一个 DerivedData 文件夹——包括那些只构建过一次、之后再没碰过的临时克隆——而且不会主动删除。每个文件夹还按配置和目标分别存放构建产物(Debug 与 Release、模拟器与真机),所以请实际测量各个项目子文件夹,而不是凭感觉估计这台 Mac 能腾出多少空间。

顾名思义,里面的一切都是“派生”出来的,随时可以重新生成。删除 DerivedData 不会碰你的源代码、项目设置或任何纳入版本控制的内容。唯一的代价是时间:每个项目下一次都要完整地重新构建,索引也会在后台重跑几分钟。

删除 DerivedData

Xcode 的 Clean Build Folder 命令(Product > Clean Build Folder,或 Shift-Command-K)只清除当前打开项目的构建产物——修复莫名其妙的构建问题很有用,但对磁盘空间几乎没有影响。想真正腾出空间,就要删除 DerivedData 文件夹本身:可以从 Xcode 的 Locations 设置里找到它,也可以在访达中直接前往该文件夹,或者在终端里删除。三种方法殊途同归。

按项目删除是精细的做法:保留每天都在构建的那两三个项目的 DerivedData,其余的全部删掉。整个删除是快捷的做法,同样没问题——只是所有项目的完整重建成本要一次付清。

  1. 先退出 Xcode。在 Xcode 运行时删除 DerivedData,可能让它的索引器陷入混乱,被 Xcode 打开的文件也未必能删干净。
  2. 找到文件夹:在 Xcode 中打开 Settings > Locations,点按 DerivedData 路径旁的小箭头,即可在访达中显示。也可以在访达中按 Command-Shift-G,直接输入 ~/Library/Developer/Xcode/DerivedData。
  3. 把项目子文件夹按大小排序,选中要删除的(或按 Command-A 全选),移到废纸篓。先移到废纸篓是更稳妥的习惯——改变主意时可以立即还原。
  4. 也可以用终端:rm -rf ~/Library/Developer/Xcode/DerivedData 一条命令全部删除。文件夹很大时它比访达快,但使用前请先阅读下面的提示。
  5. 重新打开 Xcode 并构建。每个项目的首次构建会明显变慢,活动栏里的“Indexing”也会持续一阵——这些都是一次性成本。

使用 rm -rf 要小心:它不经过废纸篓,直接永久删除,无法撤销。路径要一字不差,做这件事绝不要加 sudo;如果你不熟悉终端,用访达也能完成同样的操作,而且删错了还能还原。

清除旧模拟器运行时

模拟器往往是开发者存储空间里的另一大类。每个下载过的 iOS、watchOS 或 tvOS 运行时都有自己的占用,每台模拟设备还在 ~/Library/Developer/CoreSimulator/Devices 下保存各自的数据。如果经历过几次 Xcode 升级,请检查哪些运行时对应的系统版本已经不在你的测试范围内。

见效最快的是内置清理命令:在终端里运行 xcrun simctl delete unavailable。它会删除所有被标记为 unavailable(不可用)的模拟设备——大多是运行时被移除或旧版 Xcode 留下的孤立设备——连同其中的 App 和数据一起删除。执行前先用 xcrun simctl list devices 核对列表,如果装了不止一个 Xcode,更要仔细看。

至于运行时本身,打开 Xcode 的 Settings > Components(Xcode 14–15 中叫 Platforms)。这里会列出每个已安装的模拟器运行时及其大小;选中旧的删除即可。除非你确实要在旧系统版本上测试,否则每个平台只保留最新的运行时。

还可以在 Window > Devices and Simulators 里逐台清理模拟设备:切换到 Simulators 标签页,右键点按从来不用的设备——比如那六台装着旧测试数据、型号重复的 iPhone——选择 Delete。设备里保存的数据和 App 会一并删除。

归档、设备支持文件与缓存

每次运行 Product > Archive 分发构建,~/Library/Developer/Xcode/Archives 里就会多一份归档。每个归档都包含一份完整的 App 构建及其 dSYM 调试符号,单个往往在 100 MB 到 1 GB 之间。删除前要清楚代价:里面的 dSYM 正是为那个构建的崩溃报告做符号化的依据。仍在 App Store 或 TestFlight 上提供的版本,其归档要保留(或先确认 App Store Connect 已有对应的 dSYM),其余的可以删除——最稳妥的入口是 Xcode 的 Organizer(Window > Organizer > Archives),在那里可以对照版本信息逐个查看和删除。

iOS DeviceSupport 位于 ~/Library/Developer/Xcode/iOS DeviceSupport,存放 Xcode 从你连接过的每一台 iPhone 或 iPad 上拷贝来的调试符号——每个 iOS 版本一个文件夹,通常各占 2–5 GB。手头已经没有设备在运行的 iOS 版本,其文件夹纯属白占空间:删掉即可;以后再连接该版本的设备,Xcode 会重新拷贝符号(你会看到一次“Preparing debugger support”)。watchOS 和 tvOS 设备也有对应的同级文件夹。

Xcode 自己的缓存放在 ~/Library/Caches/com.apple.dt.Xcode,模拟器的缓存在 ~/Library/Developer/CoreSimulator/Caches。两者都会按需重建,但只能在 Xcode 和模拟器 App 都已退出时清理;CoreSimulator 里你不认识的缓存文件,请不要动。

包管理器缓存(SwiftPM、CocoaPods、npm、Homebrew)

包管理器会保留下载过的依赖,让以后的安装更快。这很有用,但在一台跑过多年项目的机器上,它们也可能变成一大块磁盘占用。这些下载缓存都可以重建,只是下次安装时需要重新下载软件包。

Swift Package Manager 把下载的包缓存在 ~/Library/Caches/org.swift.swiftpm,各项目解析后的检出(checkout)则存放在各自的 DerivedData 文件夹里——所以清理 DerivedData 时已经顺带清掉了这部分。共享缓存可以在访达里删除,也可以对该路径运行 rm -rf。

CocoaPods 把下载的 pod 存在 ~/Library/Caches/CocoaPods。清空它的正确方式是内置命令:pod cache clean --all。项目里的 Pods 文件夹不受影响,删掉的只是下载缓存。

npm 的缓存位于 ~/.npm,在大量做 JavaScript 开发的机器上可能长到好几个 GB。运行 npm cache clean --force 即可清空(npm 坚持要加这个参数,是因为缓存能自我修复,通常不需要清理;删掉它是安全的——下次安装时软件包会重新下载)。用 pnpm 的话,可以改用 pnpm store prune。

Homebrew 会囤积旧的下载文件和过时的软件包版本。brew cleanup 会移除过时版本和陈旧的下载文件;不指定软件包、全局运行时,它还会卸载已经没有任何软件需要的依赖(除非设置了 HOMEBREW_NO_AUTOREMOVE);brew cleanup --prune=all 则会连整个下载缓存一起清空。想先看看会删掉什么,可以先运行 brew cleanup -n 预览。

让清理自动化

上面这些方法都管用,但开发垃圾总是清了又来:正常工作一周,DerivedData 就又回来了,缓存会重新填满,每次 Xcode 更新又会留下一个用不上的运行时。如果你不想每个月把这六套手动流程重做一遍,这正是值得自动化的部分——前提是工具会讲清理由,而不是一声不响地批量删除。

AskClean 把开发者文件当作独立的类别来处理:一次扫描就能按项目逐项列出 Xcode DerivedData、旧模拟器运行时(通过 simctl 读取,每个平台保留最新版本)、设备支持文件,以及 npm、SwiftPM、cargo、uv 等包管理器缓存。它也能发现新近的空间大户——本地 AI 模型:Hugging Face 模型逐个列出,Ollama 模型库作为一项整体列出,全部默认不勾选。

每一项都附有说明——它是什么、能否重建、删除要付出什么代价——未经你确认,什么都不会执行。确认后的项目会被永久删除,不会移到废纸篓,所以确认前请逐项核对;你的源代码和照片图库始终不会被触碰。它做的就是本指南这份清单,只是省去了在终端里折腾一小时。

哪些可以重建,哪些不能

这是一张删除边界表,不代表每台 Mac 都能腾出同样的空间。任何操作前后都请测量你自己的 Mac——Xcode 模拟器指南里的只读盘点脚本只报告这些文件夹的大小,不会做任何修改。

类别默认位置删除后果
DerivedData~/Library/Developer/Xcode/DerivedData重新构建并重建索引;源代码和 git 历史不受影响。
模拟设备~/Library/Developer/CoreSimulator/Devices所选虚拟设备里的 App 和测试数据会丢失;请通过 simctl 或 Xcode 删除。
归档(Archives)~/Library/Developer/Xcode/Archives可能删掉崩溃符号化所需的 dSYM;请先在 Organizer 中核对。
DeviceSupport~/Library/Developer/Xcode/iOS DeviceSupport该系统版本的设备再次连接时,调试符号会重新拷贝。

常见问题

删除 DerivedData 安全吗?

安全——这是 Mac 上最稳妥的大体积删除之一。DerivedData 里只有 Xcode 根据你的源代码生成的文件:构建产物、模块缓存、索引和日志。你的代码、项目文件和 git 历史都在别处,完全不受影响。唯一的后果是每个项目下一次都要完整重建,索引也要重新跑一遍。

多久清一次 DerivedData 合适?

没有固定周期——大到影响使用时再清,对多数活跃开发者来说大约一两个月一次。有两个时刻总是值得清:急需磁盘空间时,以及某个项目出现莫名其妙的构建错误或代码补全失灵时——清空 DerivedData 是公认的第一步。

删除 DerivedData 后,Xcode 会变慢吗?

会暂时变慢。每个项目的首次构建是全新构建,可能比增量构建慢好几倍;后台索引也需要几分钟,代码补全和搜索才能完全恢复。第一轮之后,性能就和以前一样——DerivedData 存的是缓存,不是删了就永久失去的优化。

~/Library/Developer/CoreSimulator 可以删吗?

不能整个盲删——它存放着你当前已安装的模拟器及其数据,整个删掉会让它们全部无法使用,直到重新安装运行时。正确的做法是分别清理:用 xcrun simctl delete unavailable 删除孤立设备(设备里的 App 和数据会一起删除),在 Xcode 的 Settings > Components 里移除旧运行时,在 Devices and Simulators 里删掉不用的设备;手动清理只碰 Caches 子文件夹,而且要先退出 Xcode 和模拟器。

Clean Build Folder 和删除 DerivedData 是一回事吗?

不是。Product > Clean Build Folder(Shift-Command-K)只清除当前项目的构建产物,索引、模块缓存和其他项目的文件夹都原封不动。它是排查构建问题的工具,不是腾磁盘空间的工具——想真正腾出空间,就要删除 DerivedData 文件夹本身。

参考来源

开发者存储空间,逐项处理