使用 Carthage 和依赖项缓存减少 50% Xcode 构建时间

阅读数:927 2019 年 11 月 14 日 08:00

使用Carthage和依赖项缓存减少50% Xcode构建时间

在最近的一篇文章中,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

评论

发布
用户头像
心比天高,命比纸薄。
2019 年 11 月 14 日 08:53
回复
没有更多了