更改一行代码并在大型项目中执行Xcode 10.1增量构建后,Xcode在完成所有列出的任务(编译更改的文件和合并swiftmodule均已完成)之后,将大部分构建时间花费在“编译swift源文件”阶段。屏幕快照,显示任务列表:https://imgur.com/a/JoVI0zB
虽然编译和合并swift模块花费不到一秒钟,但在我的项目中,整个阶段最多可能需要2分钟(300k LOC)。
这次Xcode做什么?有什么方法可以加快这个过程吗?
用Obj-C编写的类似项目在更改1行代码后只需几秒钟即可启动。
我也有同样的问题,经过大量调查,我确定它所做的一切都是基于您拥有的快速源文件数。
演示者在2018 wwdc talk about the Xcode build system中说(可以在视频的抄本中搜索:)>
文件,它仍会解析every other swift文件。这意味着与Clang不同,当编译一个Swift文件时,编译器将解析目标中的所有其他Swift文件。
因此,即使/尽管增量构建仅需要重新编译single
我们的项目有2000多个快速的源文件,对于重新编译一个独立的文件,我们看到3分钟以上的增量编译时间。
由于在WWDC演讲中听不清,所以我自己做了以下测试:
在我的测试中,其他快速文件内容的复杂性似乎并不重要,而只是文件数量。
将您的应用程序分成较小的框架,以减少每个目标中快速源文件的数量。
[This is a decent guide显示了有关如何执行此操作的步骤,如果您还不知道如何。
在上面的测试案例中,我创建了一个新框架并将2,000个swift文件移入该框架,然后在原始项目(导入框架)中测试了递增的构建时间,并且构建时间回到了1-2秒。当然,在框架内进行增量构建仍然会很慢,但是理想情况下,您可以将项目拆分为许多较小的框架,以便每个框架都有更快的增量构建时间。
如果问题是文件数量,为什么不合并一堆文件以减少数量?因为这可能会导致增量构建速度变慢。
根据2018 WWDC's Building Faster in Xcode:
Swift的依赖关系模型基于文件
这与我们当前的问题有关,因为这意味着对文件的任何更改(仅对函数主体内容的更改除外)都将导致依赖于更改后文件中任何内容的任何文件的重新编译。
如果将多种类型合并到一个文件中,则任何更改都会影响大文件或其任何依赖项,这将导致更多代码在增量版本上重新编译。如果修改了大文件中的任何类型,它也将增加大文件所具有的依赖性,因此所有文件都将重新编译。