【问题标题】:Xcode 8 does full project rebuildXcode 8 进行完整的项目重建
【发布时间】:2017-01-20 05:45:45
【问题描述】:

在将 Swift + ObjC 项目更新到 Xcode 8 (Swift 2.3) 后,我发现 50% 或更多的时间 Xcode 会完全重建项目而不是增量构建。

所做的更改是添加简单的打印语句。似乎没有关于何时执行完全重建的逻辑。

它出现在它决定这一点的“检查依赖项”阶段。在 Xcode 7 上,这似乎不是问题。

有没有其他人遇到过这种情况?

【问题讨论】:

  • 我也遇到了这个问题 - 目前正在谷歌航行中尝试找出原因以及如何解决它,如果我看到任何东西,我会告诉你。完全相同的问题。
  • 苹果论坛相关帖子:forums.developer.apple.com/thread/62737
  • 我在 Xcode 7 和 Xcode 8 上都遇到过这个问题。

标签: swift xcode8 xcode8-beta6


【解决方案1】:

好的,这是为什么会发生的答案,但我不知道解决方案。如果您使用“其他 Swift 标志”-driver-show-incremental Xcode 将输出它根据依赖项决定需要编译的内容。您会看到如下内容:

Queuing EditProfileViewController.swift because of dependencies discovered later
Queuing ChangePasswordViewController.swift because of dependencies discovered later
Queuing JoinViewController.swift because of dependencies discovered later
Queuing JoinProfileViewController.swift because of dependencies discovered later
Queuing FormViewBuildable.swift because of dependencies discovered later
Queuing RadioTextFormView.swift because of dependencies discovered later
Queuing TextFieldFormView.swift because of dependencies discovered later
Queuing AccountProfileViewController.swift because of dependencies discovered later

我想知道这是否是 swift 3 问题,因为在转换之前我没有遇到此问题。我做了一个小示例项目,其中

FileA 包含来自 FileB 的事物 包含来自 FileC 的事物

甚至向 FileC 添加一个未在任何地方使用的文件私有更改都会导致 FileA、FileB 和 FileC 由于依赖关系而排队等待编译。我将在今天晚些时候在 Xcode 7 中测试这个示例,看看会发生什么。

所以看起来 swift 3 的依赖解析不是很好。我已经在工作中的另外 2 个 swift 3 项目中对此进行了测试,同样如此。对任何文件进行任何更改,每个文件都会被编译。直到您开始着手进行大约 15,000 行代码左右的项目时才会感觉很慢,这可能就是为什么没有人谈论这个的原因。除非您有一个中等大小的 swift 3 应用程序,否则您可能甚至不会注意到增量复杂性无法正常工作。如果我有更多了解,我会更新。

【讨论】:

  • 看起来这仍然发生在带有 swift 2 的 Xcode 7 中。甚至不确定如何利用这些信息,除了答案可能只是 swift 的增量编译仍然需要大量工作.. .
  • 您能否在错误报告中将您的示例项目提供给苹果?一位苹果开发人员正在讨论这个问题的线程上要求一个示例项目:forums.developer.apple.com/thread/62737
  • 我需要这样做,也许我明天会花时间整理一些东西。我不确定我是否理解依赖图应该如何工作。我阅读了关于它的文章github.com/apple/swift/blob/master/docs/DependencyAnalysis.rst(现在搬家了?),我觉得它比那篇文章中描述的更具侵略性,但它也解释了如果不是完全依赖,它将如何倾向于添加依赖项当然。 TL;DR 我担心现在一切都在按预期工作,我们将不得不等待未来的 swift 版本进行改进。
【解决方案2】:

我发现这始终有效,但是如果您修改桥接头中包含的标头,它将编译 swift 文件。如果你来回切换 git 分支,它也会进行完整编译。

首先确保调试的优化级别设置为无(不是整个模块优化)

那么,据https://forums.developer.apple.com/thread/62737苹果员工(ddunbar):

我们认为设置:

HEADERMAP_USES_VFS = YES

在您的项目(或所有目标)中设置为 true 可能是一种有效的解决方法 > 对许多人来说。这不能保证有效(这就是默认情况下它不是 > 的原因),但它应该适用于大多数项目。

这应该通过你的目标构建设置下的“添加用户定义的设置”来添加。

.

【讨论】:

  • 实际上这已经被几个人(包括我)尝试过,虽然最初看起来打开这个标志有帮助,但实际上并没有,一段时间后 xcode 回到整个目标重新-构建
  • 在某些情况下,xcode 需要完全重建应用程序。这修复了 xc8 中随机 xc 决定进行完全重建的已知问题。正如您上面的评论表明您在 xc7 和 8 中遇到此问题,这意味着您的问题有所不同。你和其他人可能有不同的依赖结构问题,导致 xc 决定它需要重建所有内容。
  • 刚刚尝试过,据我所知,它对我有用。谢谢!
【解决方案3】:

在 Edit Scheme > “Scheme” > Build 选项卡中取消选中“Find Implicit Dependencies”,为我修复了项目文件。 “复制 swift 标准库”仍然需要很长时间..

【讨论】:

  • 嗨,Kurt,这个解决方案已被多次提及,它适用于某些人(过去似乎适用于我)但有一些缺点,需要来回切换每当您进行完全重建时都会使用此标志,因为干净的重建需要根据 Iv 看到的情况启用此标志。
  • 嗨弗拉德,如果您只使用一种方案,是的,您必须更改它。但是,如果您对多种环境使用多种方案,这确实是一个很好的答案。例如,我有本地开发、开发、测试、rc、生产方案。我只在开发方案上使用它。
【解决方案4】:

Apple 昨天(11 月 14 日)发布了新的 Xcode 测试版

Xcode 8.2 beta 2

此问题已在发行说明中标记为已解决。

构建系统

• Xcode 不会在很小的时候重建整个目标 发生了变化。 (28892475)

它对我有用。构建速度像往常一样恢复。 遇到这个问题的小伙伴们不妨一试!

https://developer.apple.com/download/

【讨论】:

    猜你喜欢
    • 2020-03-08
    • 2016-04-04
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多