“派生数据”文件夹中有什么?
(本文最初是为我的博客 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
,编译器都必须包含并解析兆字节的附加头。 多亏了模块,标头仅被解析和编译一次。
您可以在其中看到两个名为AIEKQT3S8ZS7
和391J0EBN0O3XH
子文件夹。 这些文件夹的数量及其名称在您的计算机上很可能会有所不同。 每个子文件夹的名称均指从传递给编译器的参数计算得出的哈希值。 项目使用的唯一编译器配置越多,此文件夹中带有.pcm
文件的子文件夹越多。 每个子文件夹都包含使用给定参数预编译的同一组.pcm
文件。
有关此过程的更多信息: Xcode构建过程的幕后 。
值得一提的是, ModuleCache
文件夹不是特定于项目的,而是在所有项目之间共享的 。
Xcode在这里存储在索引阶段收集的数据。 此数据用于项目内的搜索,快速导航和重构。 在Xcode 9之前,使用SQLite以易于理解的形式存储数据。
通过Xcode 9,Apple更改了索引数据的存储方式,现在正在使用LMDB。
没什么大不了的,因为您仍然可以打开并检查mdb
文件。 但是,Apple使用的是某种哈希,而不是人类可读的密钥。
我无法进一步告诉您当前格式的工作原理,因为我找不到有关该主题的任何其他信息。 如果您有更多信息,请在下面发表评论或在Twitter上ping我。
在此文件夹中,Xcode存储按域划分的各种日志( Install
, Build
等)。 记住,我还没有构建项目,因此Build
logs文件夹为空。 看看在我构建项目时会发生什么:
有关 Xcode中的测试日志的 更多信息 。
我不知道这个文件夹是干什么用的。 我找不到一条提及此文件夹或文件的信息。 如果可以帮助您对此有所了解,请在下面评论或在 Twitter上 ping我 。
可能是“派生数据”中最重要的文件夹! 这是您最终的.app
文件(文件夹)所在的位置。 这是被复制并安装到模拟器(或iOS设备)的实际文件。
您可以看到我已经在针对iOS模拟器的Debug配置中构建了该应用程序。 当我为实际设备构建它时,将创建Debug-iphoneos
子文件夹。
最后是我要提到的最后一个文件夹: Intermediates
。 这是Xcode的构建系统在其中写入构建应用程序所需的辅助文件的地方。 这些文件也缓存在这里,以后再使用。 构建系统足够智能,不会重新编译未更改的文件。
看看当我在AppDelegate.swift
更改某些内容并再次构建时会发生什么。 您可以看到仅AppDelegate辅助文件已更新。
这篇博客文章写作需要14个小时,其中包括8个小时的研究。 (页脚受 Michele Titolo的 启发 )