【问题标题】:When can I safely delete Xcode DerivedData folder?我什么时候可以安全地删除 Xcode DerivedData 文件夹?
【发布时间】:2020-03-14 13:46:32
【问题描述】:

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

我可以简单地说,直到.xcodeproj文件发生变化,派生的数据可以安全地重复使用吗?


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

【问题讨论】:

    标签: ios xcode build configuration xcodebuild


    【解决方案1】:

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

    我不相信有任何确定的方法可以知道何时清除,这就是为什么我认为大多数人通常会问“您是否删除了DerivedData”作为有人遇到构建问题时的第一个问题。

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

    让我问你这个问题。什么更重要? “防弹”还是建造时间?我一直在为一些应用程序维护或升级构建系统。我一直把所有事情都作为一个干净的构建。这总是来自源代码控制的新鲜拉动,然后在工作区中定义了DerivedData(这些是 Jenkins 构建并配置为使用干净的工作区)。这几乎避免了与需要删除 DerivedData 相关的构建问题。由于某些 Xcode voodoo,我已经看到了太多奇怪的问题。如果您有构建错误,最好不要添加红鲱鱼。

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

    【讨论】:

    • 偏离路线的防弹是主要目标,但如果我可以确定在什么时候我可以重新使用缓存来减少构建时间,那么应用它是没有害处的。当然,为了获得优势,我需要知道确切的点。我的项目很大,构建和测试需要 20 多分钟,因此,我正在尝试应用尽可能多的选项以使其在不牺牲其健全性的情况下发挥性能。
    • 我同意你的目标。不幸的是,根据我的经验,Xcode 存在太多构建问题。我已经看到诸如被修改的文件没有被构建。因此,我去过的地方,我们采取了更保守的方法。这意味着在某些情况下要获得更快和更多的构建机器。其他人则在重新审视我们正在构建的内容,或者进行预建,甚至拆分项目。对于一个项目,我们最终将其分解为 3 个不同的项目(2 个框架和主项目)。
    • 您可以尝试重用DerivedData,然后在一天中以固定的时间间隔进行更“更彻底”的构建(例如每天一次或更多次)。跨度>
    【解决方案2】:

    您可能希望在以下情况下清理派生数据 -


    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 的代码覆盖率报告表并重新生成它。


    如果我错了,请纠正我。这是按照我的理解。

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

    【讨论】:

    • 对此的建议非常感谢。
    【解决方案3】:

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

    我想提几个你应该删除派生数据的情况:

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

    乐于助人!

    【讨论】:

    • 这不是我的问题的答案。我已经知道删除派生数据后许多问题都得到了解决。我的问题是,当这些派生数据变得陈旧时,使用此缓存会妨碍我的应用程序的预期行为。
    【解决方案4】:

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

    如果您碰巧有多个构建代理在多台机器(物理或虚拟)上运行,那么这些代理中的每一个都应该进行自己的清理。清理派生数据可能会增加第二天每个项目的首次构建时间,但是这是一个小缺点。您还将通过扼杀 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-derived-data

    【讨论】:

    • 如果我使用单一代理怎么办?我还需要为每个构建进行清洁吗?如果是这样,派生数据的用途是什么?
    • Xcode 使用派生数据来加快构建速度,但在此目录中包含索引、构建输出和日志。超时这可能会占用您硬盘上的大量空间。您始终可以重建您的依赖关系,以便释放空间,当它是一个代理时,它取决于您的构建计划,这可能需要很长时间/很短才能使这个文件夹更大/更小。
    • 假设我有无限量的存储空间,问题是关于派生数据变得陈旧的点。您的帖子中没有回答问题。
    • AFAIK ,当您的派生数据变得陈旧、随机崩溃、缓慢、自动完成在几秒钟内无法工作以及在您添加或删除库后立即生成错误时,有很多可能性。或者,只是随机出现 200 多个警告。在清除派生数据中可以找到 Xcode 构建过程中相当多问题的解决方案。所以我认为这是一种可能性。
    • 您是在猜测这些可能性还是您有适当的参考?
    猜你喜欢
    • 2016-10-23
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多