“派生数据”文件夹中有什么?

(本文最初是为我的博客 vojtastavik.com撰写的

删除派生数据-每次Xcode行为异常而无明显原因时,都会有用的众所周知的技巧。 我仍然清楚地记得,当我的长辈第一次告诉我有关此基本的iOS开发技巧时。

随着岁月的流逝,并获得了更多的经验,我开始了解可以解决什么样的错误。 但是,我从未真正了解DerivedData文件夹中的确切内容 。 我决定改变这一点,这是我的发现。

注意: DerivedData的内容随Xcode版本的不同而不同。 我在这篇文章中使用了Xcode 10.0 beta 6。

我完全删除了现有的DeriveData文件夹。 然后,我从单视图应用程序模板创建了一个名为DDExample的示例项目,并在Xcode DDExample其打开。

Xcode立即创建一个新的Derived Data文件夹,其中包含两个子文件夹-一个名为ModuleCache文件夹,另一个带有项目名称的名称,后跟某种哈希。


顾名思义,这是Xcode存储预编译模块文件( .pcm )的地方。 模块是组织和共享可重用代码的方式。 几年前,模块已引入Clang(Xcode使用的编译器),主要是为了确保合理且可扩展的编译时间。 通常,对于源文件中的每个单个import ,编译器都必须包含并解析兆字节的附加头。 多亏了模块,标头仅被解析和编译一次。

您可以在其中看到两个名为AIEKQT3S8ZS7391J0EBN0O3XH子文件夹。 这些文件夹的数量及其名称在您的计算机上很可能会有所不同。 每个子文件夹的名称均指从传递给编译器的参数计算得出的哈希值。 项目使用的唯一编译器配置越多,此文件夹中带有.pcm文件的子文件夹越多。 每个子文件夹都包含使用给定参数预编译的同一组.pcm文件。

有关此过程的更多信息: Xcode构建过程的幕后

值得一提的是, ModuleCache文件夹不是特定于项目的,而是在所有项目之间共享的


Xcode在这里存储在索引阶段收集的数据。 此数据用于项目内的搜索,快速导航和重构。 在Xcode 9之前,使用SQLite以易于理解的形式存储数据。

通过Xcode 9,Apple更改了索引数据的存储方式,现在正在使用LMDB。

没什么大不了的,因为您仍然可以打开并检查mdb文件。 但是,Apple使用的是某种哈希,而不是人类可读的密钥。

我无法进一步告诉您当前格式的工作原理,因为我找不到有关该主题的任何其他信息。 如果您有更多信息,请在下面发表评论或在Twitter上ping我。


在此文件夹中,Xcode存储按域划分的各种日志( InstallBuild等)。 记住,我还没有构建项目,因此Build logs文件夹为空。 看看在我构建项目时会发生什么:

有关 Xcode中的测试日志的 更多信息


我不知道这个文件夹是干什么用的。 我找不到一条提及此文件夹或文件的信息。 如果可以帮助您对此有所了解,请在下面评论或在 Twitter上 ping我


可能是“派生数据”中最重要的文件夹! 这是您最终的.app文件(文件夹)所在的位置。 这是被复制并安装到模拟器(或iOS设备)的实际文件。

您可以看到我已经在针对iOS模拟器的Debug配置中构建了该应用程序。 当我为实际设备构建它时,将创建Debug-iphoneos子文件夹。


最后是我要提到的最后一个文件夹: Intermediates 。 这是Xcode的构建系统在其中写入构建应用程序所需的辅助文件的地方。 这些文件也缓存在这里,以后再使用。 构建系统足够智能,不会重新编译未更改的文件。

看看当我在AppDelegate.swift更改某些内容并再次构建时会发生什么。 您可以看到仅AppDelegate辅助文件已更新。


这篇博客文章写作需要14个小时,其中包括8个小时的研究。 (页脚受 Michele Titolo的 启发