Airbnb 如何以最小干扰将构建工具从 Buck 迁移到 Bazel

Airbnb 从 Buck 迁移到 Bazel 的 iOS 构建系统

Airbnb 决定将其 iOS 构建系统从 Buck 迁移到 Bazel,旨在提升跨平台的构建效率,包括后端和前端。这一决定的主要目标是提供一致且高效的构建体验。

迁移的主要维度

Airbnb 工程师在迁移过程中重点关注两个主要维度:构建配置IDE 集成

构建配置的迁移

Bazel 和 Buck 在构建配置方面有一些相似之处,例如目录结构、命令行调用方式以及配置语言(Starlark)的使用。然而,两者在提供的规则集上存在差异。例如,Buck 提供 apple_libraryapple_binary 规则,而 Bazel 则提供 swift_libraryapple_framework 规则。即使规则名称相同(如 genrule),配置语法也往往不同。

为了解决这一问题,Airbnb 创建了一个shim 层,用于包装原生和外部规则。在过渡阶段,Airbnb 工程师创建了一个包含两个目录(rules_shim/buckrules_shim/bazel)的仓库,并为每个构建系统定义了规则,将 rules_shim 标识符关联到正确的目录。

此外,rules_shim 层还用于处理 genrule 的差异。Airbnb 使用 genrule 在 iOS 代码库中生成样板代码,而 Bazel 和 Buck 在 genrule 的语法上有所不同。通过包装层,Airbnb 工程师能够在两个系统中使用相同的 genrule 脚本。

另一个需要解决的问题是条件配置的支持。Buck 提供了 read_config 函数来读取命令行参数,而 Bazel 不支持这一功能。解决方案是通过 select 在两者之间实现命令行参数的抽象层。

IDE 集成

Airbnb 工程师的目标是替换现有的基于 Buck 的 Xcode 项目生成工具,同时保留围绕 Buck 开发的所有工具。为此,他们决定使用 XcodeGen 开发自己的 Xcode 工作区生成器。

迁移过程分为三个步骤,以避免对开发者的工作流程造成干扰:

  1. 第一步:将新的生成器与现有的基于 Buck 的解决方案集成,确保一切正常工作。
  2. 第二步:添加与 Buck 命令等效的 Bazel 命令,使开发者能够在两者之间切换。
  3. 第三步:在新的系统足够稳定后,移除对 Buck 的支持。

迁移成果

迁移后的成果显著:与 Buck 生成的项目相比,使用 XcodeGen 的生成时间减少了 60%,Xcode 的打开时间减少了 70% 以上。此外,基于 Bazel 的新构建系统还减少了构建时间,特别是在增量构建方面,并进一步优化了共享和协作效率。

如需了解更多细节,建议阅读原文。

阅读 31
0 条评论