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

When can I safely delete Xcode DerivedData folder?

我一直在 iOS 项目中工作。关于内容由构建系统生成的 Xcode Derived Data 文件夹,有很多 Whosebug 帖子, or is it safe to remove derived data folder 等,但我有 none我在找。我的问题是什么时候应该删除派生数据文件夹,什么时候不应该删除?换句话说,在什么情况下派生的数据变得不可重用,为什么?在项目或其他任何资源或配置更改后,这些派生数据是否变得陈旧?我经常看到许多问题在删除派生数据后得到解决,但我们通常不会尝试了解问题的根本原因。

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


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

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

我想提一下何时应该删除派生数据的几种情况:

  • 我多次遇到这个问题 Xcode 的调试器停止工作 突然如此解决这个问题我删除派生数据并开始 工作正常。
  • 每当您在构建项目中遇到问题时,最好删除派生数据并重新构建。
  • 删除派生数据会导致为 第一次,但它会删除项目的所有旧设置。
  • 删除派生数据可以提高系统性能,因为它拥有大量内存 space,可能很久以来就不需要了。
  • 最后但并非最不重要的错误有时是不合逻辑的, 您所要做的就是删除派生数据,错误消失了。

乐于助人!

您可能希望在 -

时清理派生数据
  1. 当您从远程存储库中提取代码时,因为它可能包含您可能在其他 module/project.
  2. 中使用的 new/deleted 文件

假设您的工作区中有两个项目(例如 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 的代码覆盖率报告并重新生成它。


如有错误请指正。这是按照我的理解。

如果我发现更多原因,将更新此答案。

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

我不相信有任何明确的方法可以知道何时清除,这就是为什么我认为大多数人通常会问 "did you remove DerivedData" 作为有人遇到构建问题时的第一个问题。

恕我直言,我认为 Xcode 在 DerivedData 中进行了一些微妙的缓存,因为我在无法追踪的奇怪情况下遇到过构建失败。如果 Xcode 有一些与此缓存相关的细微错误,我不会感到惊讶。一般来说,我只信任项目 DerivedData 的命令行删除。如果我格外小心,我还会清除任何关联的 libraries/frameworks 以及 ModuleCache(在 DerivedData 中)。 /var/folders 中也有一些巫术。不确定情况是否仍然如此,但我发现自己在那里做了外科手术。是的,不好。但我也是那种以编辑 project.pbxproj 文件来修复它而闻名的人,所以我想我把谨慎抛诸脑后了。

让我问你这个问题。什么更重要? "bullet-proof" 还是构建时间?我一直在为一些应用程序维护或升级构建系统。我总是以干净的方式完成所有工作。这始终是来自源代码控制的新鲜拉动,然后在工作区内定义了 DerivedData(这些是 Jenkins 构建并配置为使用干净的工作区)。这几乎避免了与需要删除 DerivedData 相关的构建问题。由于某些 Xcode 巫术,我已经看到太多奇怪的问题发生了。如果您有构建错误,最好不要添加红色鲱鱼。

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

什么时候可以删除派生数据?

如果您碰巧在多台机器(物理机或虚拟机)上有多个构建代理 运行ning,那么每个代理都应该做它自己的 cleanup.Cleaning 派生数据可能会增加时间第二天首先为每个项目构建,但这是一个小缺点。您还可以通过杀死 DerivedData 的巨大胃口来索回免费 space。带回家的实用建议 - 定期清理 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-derived-data