【发布时间】:2019-03-26 10:25:12
【问题描述】:
我在一个 iOS 项目的团队中工作,该项目在 Swift 代码方面已经发展到巨大的规模。
从干净状态构建项目大约需要 10 分钟,并且在更改代码中的任何内容后构建和运行项目需要 30 秒,即使该代码与私有方法中的单行有关不会在其他任何地方使用的 Swift 文件符号。
我们已经尝试了很多方法来缩短构建时间,包括来自这个好资源 https://github.com/fastred/Optimizing-Swift-Build-Times 的技术 没有任何帮助,您仍然需要在更改每个小东西后等待整整 30 秒才能在应用中看到它。
我们使用 Xcode 10,即“新构建系统”,编译模式设置为增量。如果我通过 Perform Action > Build With Timing Summary 构建项目,最长的阶段是“Swift 代码编译”,这并不是什么新鲜事。我们怀疑 Xcode 试图遵循保守的编译决策并重建每个可能与修改后的 Swift 代码有任何联系的 Swift 文件。而且似乎 Xcode 大部分时间都是错误的,做了多余的工作。
我有点怀念 Objective-C 的日子,那时编译器会查看所有 import/include 语句,只重建显式声明的依赖项,这意味着构建时间非常快。
所以我现在认为也许我们可以将项目分解为模块,并在 Swift 中普遍使用import 来告诉编译器哪些 Swift 文件依赖于哪些其他 Swift 文件。
是否有一种很好的自动化方法可以将一个大项目模块化为许多小组件,以加快常规的“让我们尝试如何工作”构建?
【问题讨论】:
-
好吧,如果您已经尝试了您链接的文章中提到的所有内容,那么就没有什么可做的了。但是,文章提到的一件事也是我们在当前项目中所做的事情,因为我们面临着同样的问题(大约 10 分钟的干净构建时间)。我们将我们拥有的所有代码模块化到单独的框架中,然后将这些框架链接到主项目中。通过这种方式,您可以删除必须在主项目中编译的代码量,并且您可以清楚地区分这可能会导致发现代码异味/不良架构。
-
@SanderSaelmans 有没有一种简单/自动化的方式来模块化 Xcode 项目?
-
这才是真正的罪魁祸首。如果您将它们用作预构建框架(Carthage),它将大大减少。
-
@Kamran CocoaPods 豆荚不是已经隔离了不需要重建的框架/目标吗?
-
值得阅读的案例研究tech.wayfair.com/2018/10/…
标签: ios swift xcode build compilation