Levo 指南 · 开发者:Apple
如何删除 DerivedData,删了安全吗?

安全。DerivedData 里只有 Xcode 根据源代码生成的构建产物、索引和日志,删掉它的代价只是一次较慢的构建。请先退出 Xcode,构建或归档进行中时不要删除。
| 内容 | 位置 | 删除后会怎样 |
|---|---|---|
| 构建产物 | DerivedData/<Project>-<hash>/Build | 下次构建时重新生成 |
| 索引存储 | …/Index.noindex | Xcode 会重新索引,搜索和代码补全会慢一阵 |
| 日志 | …/Logs | 旧的构建日志会从 Report navigator 中消失 |
| Swift 包 | …/SourcePackages | 需要重新下载包,所以得联网 |
| 模块缓存 | DerivedData/ModuleCache.noindex | 会重新生成,所有项目共用 |
自己动手清理
文件夹位于 ~/Library/Developer/Xcode/DerivedData,每个项目一个子文件夹,名称是项目名加一串哈希。按需要选择方法。
- 单个项目,在 Xcode 中。选择 Product › Clean Build Folder(⇧⌘K)。它会清除该项目的构建产物,但保留索引。
- 单个项目,在访达中。打开 Xcode › Settings › Locations,点按 Derived Data 旁边的小箭头,把该项目的文件夹移到废纸篓。
- 全部清理,在终端中。先退出 Xcode:
du -sh ~/Library/Developer/Xcode/DerivedData
rm -rf ~/Library/Developer/Xcode/DerivedData/*
文件夹本身可以保留,就算没了 Xcode 也会重新创建。对于使用 -derivedDataPath 的命令行构建,请删除那个文件夹。
如果正在构建、归档或运行 UI 测试,或者你在飞机上又用到了 Swift 包,请先等等:SourcePackages 也会被删掉,需要重新下载。想保留它,就只删除 Build 和 Index.noindex 文件夹。
如果清理后项目表现异常,再用 File › Packages › Reset Package Caches 重置包。SwiftPM 和 CocoaPods 缓存也是同样的道理。
清理后问题仍未解决时
开发者常通过清理 DerivedData 来解决卡住的构建,而且往往有效,因为罪魁祸首是过期的模块缓存或索引。如果没用,问题就出在别处:某个包解析到了错误的版本、Pods 文件夹过期,或者签名设置有误。接下来可以按照包缓存指南重置包。
如果这个文件夹总是又涨到 30 GB 以上,看看哪些项目文件夹最大:du -sh ~/Library/Developer/Xcode/DerivedData/* | sort -h。项目的每个分支或克隆都有自己的文件夹,因为哈希来自项目路径。同一个 App 签出十份,就是十份副本。
你也可以在 Xcode › Settings › Locations 中把 DerivedData 移到别处,比如外置硬盘。这样可行,但在较慢的硬盘上构建会明显变慢。对大多数人来说,定期清理更划算。
Levo 怎么做
Levo 把每个项目的 DerivedData 文件夹归入 Xcode 构建数据分组,显示大小和上次构建时间。Select › Smartly 会优先勾选你很久没碰过、或源代码文件夹已不存在的项目;你今天早上刚构建过的那个则保持不勾选。
当 Xcode、xcodebuild 或构建服务正在运行时,Levo 会把该行标为锁定并说明原因。取消勾选你想保留的项目,然后点击 Clean up。完整的检查清单见Levo:面向 iOS 和 Mac 开发者。
常见问题
删除 DerivedData 安全吗?
安全。里面是根据你的源代码生成的构建产物、索引和日志。Xcode 会重新生成,所以删除后的第一次构建会慢一些。
Mac 上的 DerivedData 在哪里?
在 ~/Library/Developer/Xcode/DerivedData。打开 Xcode 设置中的 Locations,点按 Derived Data 旁边的箭头即可在访达中显示。
删除 DerivedData 会丢失断点或 scheme 吗?
不会。它们保存在项目或 workspace 中,不在 DerivedData 里。你只会丢掉旧的构建日志和缓存的索引。
为什么 Xcode 总是又把 DerivedData 塞满?
每次构建都会写入这里,每个项目一个文件夹,外加索引。大型项目加上多个分支,加起来就是几十 GB,所以每隔几周清理一次很正常。