在大型项目中更改单行代码并执行 Xcode 10.1 增量构建后,Xcode 在完成所有列出的任务后将大部分构建时间花费在“编译 swift 源文件”阶段(编译更改的文件和合并 swiftmodule 均已完成)
显示任务列表的屏幕截图:https://imgur.com/a/JoVI0zB
虽然编译和合并 swift 模块只需不到一秒钟的时间,但在我的项目中,整个阶段最多可能需要 2 分钟(300k LOC)。
这段时间 Xcode 做了什么?有什么方法可以加快这个过程吗?
在更改 1 行代码后,用 Obj-C 编写的类似项目只需几秒钟即可启动。
最佳答案
我有同样的问题,经过大量调查后,我确定无论它在做什么,它都是基于 swift 源文件的数量你有。
根本原因
在 2018 wwdc talk about the Xcode build system主持人说(可在视频的文字记录中搜索):
What this means is that unlike Clang, when compiling one Swift file, the compiler will parse all the other Swift files in the target.
所以即使/尽管增量构建只需要重新编译 单文件,它仍然解析 每隔快速文件。
我们的项目有超过 2000 个 swift 源文件,我们发现重新编译单个独立文件需要 3 分钟以上的增量构建时间。
测试以证明根本原因
因为在 WWDC 演讲中听到它是不够的,所以我自己做了以下测试:
在我的测试中,附加 swift 文件的内容的复杂性似乎并不重要,只有文件的数量。
解决方案 - 模块化/框架
将您的应用程序分成更小的框架,以减少每个目标中的 swift 源文件的数量。
This is a decent guide如果您还不知道如何操作,则显示如何执行此操作的步骤。
在上面的测试用例中,我创建了一个新框架并将 2,000 个 swift 文件移动到框架中,然后在原始项目中测试增量构建时间(导入框架),构建时间回到 < 1-2 秒。当然,在框架内进行增量构建仍然会很慢,但理想情况下,您会将项目拆分为许多更小的框架,以便每个框架都有更快的增量构建时间。
不是解决方案 - 合并文件
如果问题是文件数量,为什么不合并一堆文件以减少数量?因为它可能会导致较慢的增量构建。
根据2018 WWDC's Building Faster in Xcode :
Swift's dependency model is based around files
这与我们当前的问题有关,因为这意味着对文件的任何更改(仅对函数体内容的更改除外)将导致重新编译依赖于已更改文件中的任何文件的任何文件。
如果您将许多类型合并到一个文件中,如果任何更改触及大文件或其任何依赖项,它将导致在增量构建中重新编译更多代码。它还将增加大文件具有的依赖项的数量,因此如果修改了大文件中的任何类型,它们都会重新编译。
关于swift - Xcode 10 iOS 应用程序构建, "hidden"任务占用了大部分构建时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54448183/