2016-09-12 101 views
48

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

所作的更改添加了简单的打印语句。关于什么时候进行完全重建似乎没有任何逻辑。

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

有没有其他人遇到过这个?

+0

我有这个问题too-目前在谷歌航行,试图找出原因和如何解决它,我要让你知道,如果我看不到任何东西。完全相同的问题。 –

+1

相关的苹果论坛主题:https://forums.developer.apple.com/thread/62737 –

+1

我有这个问题与Xcode 7和Xcode 8. – Lukas1

回答

32

我发现这个工作一致,但它会编译swift文件,如果你修改包含在桥接头中的头。如果你来回切换git分支,它也会进行完整的编译。

首先作出调试确保优化级别设置为无(而不是整个模块的优化) enter image description here enter image description here

然后,根据https://forums.developer.apple.com/thread/62737苹果员工(ddunbar):

我们认为,设置:

HEADERMAP_USES_VFS = YES 

在您的项目(或所有您的目标)中为true可能b对许多人来说,这是一个有效的解决方法。这不能保证能够正常工作(这是默认情况下它不是已经启用的原因),但它应该适用于大多数项目。

这应该通过您的目标生成设置下的“添加用户定义的设置”添加。

enter image description here

enter image description here

+5

实际上这已经被几个人(包括我)尝试过了,虽然最初它可能看起来像是开启了这个标志,但实际上并没有,过了一段时间xcode返回到整个目标重新编译 – Lukas1

+0

有些情况下,xcode将需要完全重建应用程序。这解决了xc8中随机xc决定进行完全重建的一个知识问题。正如你上面的评论表明你在xc7和8有这个问题,这意味着你的问题是不同的。你和其他人可能有不同的依赖性结构问题,导致xc决定需要重建所有的东西。 – Vlad

+1

刚刚尝试过,并且据我所知它对我来说确实有效。谢谢! –

12

好的,这是为什么发生的答案,但我不知道解决方案。如果您使用“其他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 

我想知道如果这是一个快捷的3问题,因为我不是在转换之前有这个问题。我做了其中

FILEA inclues从FILEB的事情包括从FileC

,甚至增加FileC文件私人的变化,这不是任何地方使用导致FILEA,FILEB和FileC排队的事情一个小例子项目由于依赖关系编译。我将在今天晚些时候在Xcode 7中测试这个例子来看看会发生什么。

所以它看起来像swift 3的依赖关系解析不能很好地工作。我已经在另外两个快速的3个项目上测试了这一点,同样的情况也是如此。在任何文件中进行更改,并且编译每个文件。在你开始使用大约15,000行代码进行项目之前,它并不感觉慢,这可能就是为什么没有人谈论这件事。除非你有一个中等大小的swift 3应用程序,否则你可能甚至不会注意到增量复杂化并不正确。如果我学到更多东西,我会更新。

+1

看起来像这仍然发生在Xcode 7与swift 2.不是甚至可以确定这些信息是什么,除了也许答案很简单,就是swift的增量编译仍然需要很多工作... –

+0

你能否在bug报告中使你的示例项目可用于苹果?一位苹果开发人员正在讨论这个讨论这个问题的线索,请求一个示例项目:https://forums.developer.apple.com/thread/62737 – rob

+0

我需要这样做,也许我明天要花点时间在一起。我不确定我是否理解依赖图应该如何工作。我读了它上面的写法https://github.com/apple/swift/blob/master/docs/DependencyAnalysis.rst(现在已经搬家了?),我觉得它比这篇文章中描述的更具侵略性,但它也解释了如果它不完全确定,它会如何倾向于增加依赖关系。 TL; DR我担心的是,事情现在正在按预期工作,我们将不得不等待未来版本的改进。 –

8

取消勾选“查找隐含相关性”编辑计划>“计划”> Build标签固定为我的项目文件。 “复制快捷标准库”仍需要永远..

+0

嗨库尔特,这个解决方案已经被多次提及,它可以为一些人工作(过去似乎为我工作),但有一些缺点,一个是需要来回切换这个标志,每当你做一个完整的因为干净的重建将需要这从伊冯看到的。 – Vlad

+0

嗨弗拉德,如果你只使用一个计划是的,你必须改变它。但是,如果您在多个环境中使用多种方案,这是非常好的答案。例如,我有本地开发,开发,测试,RC,生产计划。我只在开发计划中使用它。 – kekkeme

10

苹果发布新的测试版本的Xcode昨日(11月14日)

Xcode 8.2 beta 2

而且随着发行说明解决这个问题已经被标记。

构建系统

•Xcode中不会重建整个目标时,只有很小的变化 发生。 (28892475)

它正在为我工​​作。构建速度照常恢复。每个遇到这个问题的人都应该试一试!

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