Levo 指南 · 开发者:Apple

如何删除 DerivedData,删了安全吗?

Levo 的弹出窗口,Ready to free 列表中已勾选 Xcode 构建数据,并显示大小和原因

安全。DerivedData 里只有 Xcode 根据源代码生成的构建产物、索引和日志,删掉它的代价只是一次较慢的构建。请先退出 Xcode,构建或归档进行中时不要删除。

内容位置删除后会怎样
构建产物DerivedData/<Project>-<hash>/Build下次构建时重新生成
索引存储…/Index.noindexXcode 会重新索引,搜索和代码补全会慢一阵
日志…/Logs旧的构建日志会从 Report navigator 中消失
Swift 包…/SourcePackages需要重新下载包,所以得联网
模块缓存DerivedData/ModuleCache.noindex会重新生成,所有项目共用

自己动手清理

文件夹位于 ~/Library/Developer/Xcode/DerivedData,每个项目一个子文件夹,名称是项目名加一串哈希。按需要选择方法。

  1. 单个项目,在 Xcode 中。选择 Product › Clean Build Folder(⇧⌘K)。它会清除该项目的构建产物,但保留索引。
  2. 单个项目,在访达中。打开 Xcode › Settings › Locations,点按 Derived Data 旁边的小箭头,把该项目的文件夹移到废纸篓。
  3. 全部清理,在终端中。先退出 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,所以每隔几周清理一次很正常。