我什么时候可以安全地删除Xcode DerivedData文件夹



我一直在iOS项目中工作。关于内容由构建系统生成的Xcode Derived Data文件夹,有很多Stackoverflow帖子,如何删除派生数据文件夹或删除派生数据文件是否安全等,但我没有在寻找。我的问题是知道什么时候应该删除派生数据文件夹,什么时候不应该删除?换句话说,在什么条件下,这些派生数据变得不可重用,为什么?在项目或其他项目的资源或配置更改后,这些派生数据是否会过时?我经常看到许多问题在删除派生数据后得到解决,但我们通常不想知道问题的根本原因。

我可以简单地说,在.xcodeproj文件更改之前,派生的数据可以安全地重用吗?


问题背景 :在我的项目中,我有一个验证构建系统,因此每个CL在合并到远程分支之前都需要通过验证构建。因此,当我应该(或不应该)重用派生的数据文件夹以使验证构建系统具有性能时,我需要知道架构师面临的风险

遗憾的是,删除DerivedData已成为试图解决构建问题的全部方法。如您所知,您可以在任何时间点删除DerivedData,而不会出现任何问题(当然,除非您正在构建)。关于何时安全的细微差别有点复杂。在实践中,我通常发现在构建之间对代码进行重大更改可能会出现问题。同样,更改Xcode版本也可能出现问题。这里的关键词是可以,这并不意味着它会。

我不认为有任何明确的方法可以知道何时清除,这就是为什么当有人遇到构建问题时,大多数人通常会问"你删除了DerivedData吗"。

IMHO,我认为Xcode在DerivedData中做了一些微妙的缓存,因为我在无法跟踪的奇怪情况下遇到过构建失败。如果Xcode有一些与此缓存相关的微妙错误,我不会感到惊讶。一般来说,我只信任命令行删除项目的DerivedData。如果我格外小心,我还会清除任何相关的库/框架以及ModuleCache(在DerivedData中)。CCD_ 11中也有一些伏都教。不确定情况是否仍然如此,但我发现自己在那里做了核武器手术。是的,很糟糕。但我也是那种编辑project.pbxproj文件来修复它的人,所以我想我把谨慎抛到了九霄云外。

让我问你这个问题。什么更重要?"防弹"还是构建时间?我被拉去维护或升级一些应用程序的构建系统。我做任何事情都很干净。这总是从源代码管理中获取新的内容,然后在工作区中定义DerivedData(这些都是Jenkins构建的,被配置为使用干净的工作区)。这几乎避免了与需要删除DerivedData相关的构建问题。我已经看到太多奇怪的问题发生由于一些Xcode巫毒。如果您有构建错误,最好不要添加危险信号。

如果您确实发现构建以及所需的任何测试花费的时间太长,您可以开始设计其他策略来帮助使其更易于管理。这变得非常依赖于项目。例如,在我正在进行的一个项目中,我将所有的库移到了预构建版本。出于某种原因,他们设置了它,在构建过程中必须构建所有第三方libs(如openssl)。这也意味着开发人员在第一次构建或任何时候清理时都会受到这种构建惩罚。

当-时,您可能需要清理派生数据


  1. 当您从远程存储库中提取代码时,因为它可能包含您可能在其他模块/项目中使用的新文件/已删除文件

考虑一下您的工作区中有两个项目(比如ProjectA和ProjectB)。

1) You already build your app and their derived data is available.
3) Now consider there is reference to some `Class` of Project A in Project B. You have used static function form  ProjectA classes.
2) Now you pull code from remote repo and it contains changes for Project A only.
3) In this pull, the used static function form ProjectA gets deleted.
3) When you build app again, only Project A gets complied again but not Project B because it has no code change. Inshort, when there is change in code XCode complies that module again not complete app.
4) Now you will you get build issue as dependencies are not correct now. Project B has no idea what happened.
5) So in this case, you should clean derived data.

  1. 正确的代码覆盖率报告

代码覆盖率报告到位于~/Library/Developer/Xcode/DerivedData的默认派生数据目录中。您可以从DerivedData中清除代码覆盖报告,然后再次对其进行regerate。


如果我错了,请纠正我。这是根据我的理解。

如果我发现更多原因,会更新这个答案。

派生数据也会占用大量空间。派生数据是在每个应用程序构建过程中生成的。派生数据包含有助于加快生成时间的中间生成结果、生成的索引。您可以将派生数据视为web浏览器中的缓存数据/图像,大多数情况下,当您第一次浏览网页时,web浏览器会自动将数据/图像保存到硬盘中,而下次访问同一网页时,页面加载速度会更快,因为web浏览器会使用硬盘中缓存的数据/图像。

当你应该删除派生数据时,我想提到的几个案例:

  • 我多次遇到Xcode的调试器停止工作的问题突然解决了这个问题,我删除了派生数据,它开始了工作良好
  • 每当您在构建项目中遇到问题时,最好删除派生数据并重新构建
  • 删除派生数据会导致的生成项目出现轻微延迟第一次,但它删除了项目的所有旧设置
  • 删除派生数据可以提高系统的性能,因为它拥有大量的内存空间,而这些空间可能很长时间都不需要
  • 最后但并非最不重要的是,对于有时不符合逻辑的错误,你所要做的只是删除派生数据&错误消失了

很乐意提供帮助!

何时可以删除派生数据?

如果您碰巧有多个生成代理在多台计算机(物理或虚拟)上运行,那么这些代理中的每一个都应该自己进行清理。清理派生数据可能会增加第二天每个项目的首次构建时间,但这是一个小缺点。您还可以通过扼杀DerivedData的巨大胃口来收回可用空间。一个实用的建议是定期在你的CI框上清理Xcode派生数据,你可以创建一个cron作业来完成这项工作,让它在午夜后运行一段时间,然后执行这个简单的shell命令。

rm -rf /Users/username/Library/Developer/Xcode/DerivedData/*

为了在开发机器上日常使用,请在bash配置文件中创建一个类型别名。

typealias xcode-clean-derived="rm -rf /Users/i4niac/Library/Developer/Xcode/DerivedData/*"

来源:https://mgrebenets.github.io/mobile%20ci/2015/02/01/xcode-导出数据

最新更新