在最近的一篇文章中,Spotify 工程师 Patrick Balestra 解释了他们如何使用依赖关系管理器 Carthage 来避免反复重建依赖项,从而将 Xcode 的构建时间减少了 50%。
使用 Xcode 时,开发人员可以使用不同的方式来处理外部依赖项。你可以手动进行,也可以使用CocoaPods、Carthage或Swift包管理器。除了 Carthage, 其他的 Xcode 依赖项管理器通常都会从源代码构建所有外部依赖项,而 Carthage 支持从 GitHub 上下载已经构建好的二进制文件,或者从已知的本地位置获取。
Balestra 说,从源代码构建依赖项对效率有巨大的影响,因为所有的开发人员都必须在他们的机器上构建外部依赖项,每次清理项目工件时也需要重新构建,例如,在进行一个新的持续集成构建时。通过分析构建日志,Spotify 的工程师得出了一个惊人的结论。
在我们的持续集成环境中,我们对 Spotify Artists App 的 Swift 源代码编译时间和它的依赖项的编译时间进行了对比,我们很快就发现,在开始编译 App 的代码之前,大约有 60-70%的时间被用在反复编译相同的依赖项上。
在 Swift 可以支持二进制稳定性之后,并且 Swift 包管理器可能在某个时候也引入对二进制发行版的支持,那么这种情况就可能会有所改变。但目前在 Xcode 中管理二进制依赖项的惟一可用选项是手动管理或借助 Carthage。
如果团队和 CI 管道共享了预构建的二进制模块,那么链接这些模块的好处就会更大,但需要使用某种分布式存储。在这种情况下,团队成员和 CI 管道可以直接链接共享的二进制模块。由于 Carthage 只支持二进制模块的本地存储,所以开发人员通常使用第三方工具(如Rome)将 Carthage 工件缓存在 S3 中,让整个团队都可以使用。
Rome 通过避免重新构建相同的依赖项来加快后续的构建速度。它将 Carthage/Build 目录的内容缓存到外部文件夹(例如~/Library/Chaches)或远程服务器(例如 Amazon S3)。
由于 Spotify 工程师不使用 S3,他们使用的是 Artifactory,所以不得不对 Rome 进行扩展,以便支持更多的远程存储系统。借助他们的工作成果,你现在可以使用自己喜欢的脚本语言编写脚本让 Rome 能够在任意位置远程存储工件。
在加入了对 Rome 的支持之后,很快就发现情况得到了改善。我们发现,在我们的 CI 配置中,Artists App 的构建时间立即减少了约 50%:从大约 20 分钟减少到不到 10 分钟!
Spotify 工程师发现的一个主要问题是 LLDB 无法调试二进制模块,因为编译器在二进制文件中保存的是符号的绝对路径。这在支持 Swift 5.1 和二进制模块分发的最新 Xcode 版本中应该已经发生变化了,但 InfoQ 无法与 Spotify 确认他们使用的是哪个版本的 Xcode。
原文链接:
Reduce Xcode Build Times Using Carthage and Caching Binary Dependencies
评论 1 条评论