WWDC18:在Xcode 10中优化Swift构建时间的现代技巧

使用Xcode 10,在构建Swift项目时,性能和开发人员的工作效率有了很大的提高。 构建时间很无聊,如果构建时间更长,可能会分散开发人员的注意力,Apple付出了一些努力来优化构建时间,尤其是对于Swift语言。 基本上,构建时间取决于所使用的代码行,代码行数,依赖性和机器配置。 Xcode 10和Swift编译器今年都宣布了各种新功能,从而使Swift构建比以往更快。 这个GitHub存储库中已经涵盖了各种技巧,但是我们将介绍Xcode 10和Swift 4.2中的新增内容,这些内容将有助于我们更快地构建Swift。

1.了解Xcode的构建过程

构建过程是使用一些本机命令行工具(例如swiftc,clang,ld,actool,ibtool等)在后台执行的任务的集合。它涉及编译和链接源代码,复制资源(如资产,StoryBoards,代码)使用构建脚本等进行签名和自定义。 但是,Xcode的构建过程可以有效并以正确的顺序自动执行这些任务,因此我们可以加快构建过程。 如果可能,可以并行完成Swift源文件的编译,以便链接器可以一次执行所有这些任务,以准备应用程序的可执行文件。 Xcode构建系统负责分析依赖关系并确定可以并行运行的任务。 理解增量构建的概念也很重要,这样,如果不进行更改,就不需要构建所有东西。 通过观看此WWDC会话,您将了解有关Xcode构建过程如何在后台工作的更多信息。 为了加快构建过程,我们应该通过识别和优化应用程序中的依赖关系来帮助构建系统更快地完成其工作。 这就是为什么了解Xcode构建过程如何在后台运行很重要的原因。

2.使用新的构建系统

Apple在Xcode 9中启动了新的构建系统,但默认情况下未激活它。 但是,对于Xcode 10,默认情况下会激活新的构建设置,并从Xcode文件->项目/工作区设置中启用

查看有关Xcode新构建系统的先前博客文章,以获取有关构建系统的详细信息。 如果要使用xcodebuild从命令行构建iOS项目,那么我们必须传递附加参数-UseNewBuildSystem = YES还将强制使用新的构建系统。 新的构建系统称为xcbuild。 苹果xcbuild的二进制文件位于路径中

  /Applications/Xcode.app/Contents/SharedFrameworks/XCBuild.framework/Versions/A/Support/xcbuild 

3.并行化Swift构建

Xcode项目由多个目标组成,一个目标可能依赖于另一个目标来构建。 Xcode目标指定了要构建的产品,例如,对于主应用程序和单元或UI测试,我们可能有不同的目标。 当一个目标依赖于要构建的另一个目标时,它会创建依赖关系,例如对iOS应用程序的单元测试,我们首先需要构建主应用程序,然后才能构建单元测试目标以执行单元测试。 在Xcode构建阶段中,我们可以使用Target Dependencies显式指定目标依赖关系,并隐式使用Link Binary with Libraries

串行构建目标将需要时间,并且可能不利于利用系统资源。 如果可能的话,建立目标真是太棒了。 借助Xcode 10,我们可以并行化构建并分析引擎盖下的依赖关系,从而显着增加了构建时间。 我们可以通过编辑Xcode方案并在方案的构建动作中检查并行构建来启用并行构建。

确保同时检查了Parallelize Build和Find Implicit Dependencies,以确保我们从Xcode中获得最佳性能。 并行化构建将确保在可能的情况下并行运行构建,并且Find Implicit依赖项将检查项目内部的所有依赖项,通常在“将二进制文件与库链接”构建阶段。 Xcode 10还引入了“并行目标构建过程”的功能,这意味着从属目标可以尽快开始编译而无需首先等待完成,但是它必须等待第一个目标的“运行脚本”阶段。

4.改善运行脚本阶段

在Xcode的构建阶段,我们可以添加自定义运行脚本来根据我们自己的项目需求进行构建过程。 很好的例子是Carthage,如果您使用Carthage进行依赖项管理,那么您必须经历过运行脚本阶段。 我们必须添加运行脚本阶段以及输入和输出文件,如下所示

如您所见,我们已在运行脚本阶段指定了输入文件,这对于构建系统做出决定是否需要运行运行脚本对于相关目标构建非常重要。 在适用的情况下,最好将输入文件提供给运行脚本。 当输入文件的数量增加到Xcode 10时,我们便可以以.xcfilelist格式指定所有输入文件,并且可以在构建阶段将此文件添加为文件列表输入。 当没有输入文件,更改的输入文件或缺少输出文件时,Xcode构建系统将始终运行此构建阶段。 添加这些文件非常重要,以避免在不需要时为所有增量构建运行此阶段。 Xcode帮助中还提供了有关运行脚本阶段的文档

您可以在文档中阅读有关“运行脚本”阶段的更多信息。

5.分析构建时间

借助Xcode 10,我们可以使用时间摘要来分析构建过程,这有助于我们确定构建所花的时间,并采取纠正措施以减少构建时间。 这项新功能将显示构建系统执行的每个任务的时序,可以在Xcode产品→执行操作→生成具有时序摘要的选项中找到。

也可以使用xcodebuild工具在命令行中启用此功能。

  $ xcodebuild -showBuildTimingSummary 

这将在日志中打印构建摘要时间。 通过使用这种技术,我们可以分析需要做什么才能使构建更快。

6.编译模式与优化级别

最近,Apple分离了构建设置“ 编译模式”“优化级别”,以便我们可以通过调试构建来控制编译机制。 编译模式是项目构建方式的一种模式,在该模式中,我们可以设置是否需要优化速度或在调试模式下跳过构建速度。 如果是调试版本,则并非总是需要整体优化,因此我们可以将此选项设置为调试版本的增量选项。 在Xcode 10中,默认情况下,“编译模式”设置为“增量”。 随着整个模块停止执行增量构建并在构建过程中构建所有文件,这将大大加快构建速度。 对于调试版本,“优化级别”构建设置可以设置为“无优化” ;对于发行版本,可以将其设置为“针对速度优化” 。 您会看到Xcode 10中引入了一个新选项“ Optimize for Size” ,该选项可用于检查代码大小。 这是通过编译应用程序而不是应用程序或资产的大小生成的机器代码。

您可以看到Xcode 10默认启用了正确的选项。 如果不使用这些选项,则应立即更改这些选项,以从新的Xcode功能中受益。

7.聪明地管理依赖性

每个应用程序都有内部或外部依赖关系,这可能会减慢构建过程。 检查依赖项并对其进行正确分类是一个好主意,以帮助Xcode构建系统更好地执行。 依赖关系来自Xcode项目中的各个位置,它们可能是内置的,目标依赖关系或Link Binary with Libraries中的隐式依赖关系,构建阶段依赖关系或方案顺序依赖关系。 我们必须妥善管理它们,以提高速度

  • 选择权限依赖管理解决方案。 迦太基或CocoaPods,请查看上一篇文章,以在迦太基或CocoaPods之间进行选择
  • 添加隐式依赖而不是显式依赖
  • 管理项目和工作区,以便轻松访问所有代码
  • 确定将依赖项源代码放入存储库中或动态下载的策略。
  • 使用依赖项管理的缓存策略来加快构建速度

结论

结合使用Xcode 10和Swift 4.2,我们可以利用Apple今年推出的新功能来加快Swift的构建。 希望您喜欢从WWDC2018收集并在当前项目中实现的这些技巧。 在下面的评论中,让我知道您对Xcode 10的这些功能的看法。

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。