swift - Xcode 10 iOS 应用程序构建, "hidden"任务占用了大部分构建时间

标签 swift xcode build xcode10

在大型项目中更改单行代码并执行 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 演讲中听到它是不够的,所以我自己做了以下测试:
  • 创建了一个新项目
  • 测试几乎空项目的增量构建时间,更改单个文件
  • 增量构建几乎瞬间完成(< 1-2 秒)
  • 使用脚本生成 2,000 个 swift 文件,每个文件包含一个具有唯一名称的简单结构、2 个变量和一个简单函数。任何文件之间都没有依赖关系。
  • 将包含 2,000 个新 swift 文件的目录添加到项目并完成完整构建。
  • 再次测试单个文件的增量构建时间
  • 增量构建时间超过 1 分钟

  • 在我的测试中,附加 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/

    相关文章:

    string - 从字符串创建 NSData 对象

    xcode - 如何仅查看 Swift 文件的公共(public) API "header"?

    IOS 构建良好但在设备上运行时出错

    iOS - 创建页面 pdf

    ios - 如果 URL 快速失败,如何为 AVPlayer 重新加载数据

    ios - UITextField:如何对 "Done"键使用react并验证输入

    swift - 如何使用 SwiftUI 和 GoogleMaps iOS SDK 关注用户位置

    build - 不安全代码需要指定 `unsafe` 命令行选项 Monodevelop 4.0.12

    android - Android Studio 升级到 3.1 后无法构建/同步新项目或现有项目

    angular - Angular 如何构建和运行