Airbnb 从 Buck 迁移到 Bazel 的 iOS 构建系统
Airbnb 决定将其 iOS 构建系统从 Buck 迁移到 Bazel,旨在提升跨平台的构建效率,包括后端和前端。这一决定的主要目标是提供一致且高效的构建体验。
迁移的主要维度
Airbnb 工程师在迁移过程中重点关注两个主要维度:构建配置和IDE 集成。
构建配置的迁移
Bazel 和 Buck 在构建配置方面有一些相似之处,例如目录结构、命令行调用方式以及配置语言(Starlark)的使用。然而,两者在提供的规则集上存在差异。例如,Buck 提供 apple_library 和 apple_binary 规则,而 Bazel 则提供 swift_library 和 apple_framework 规则。即使规则名称相同(如 genrule),配置语法也往往不同。
为了解决这一问题,Airbnb 创建了一个shim 层,用于包装原生和外部规则。在过渡阶段,Airbnb 工程师创建了一个包含两个目录(rules_shim/buck 和 rules_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 工作区生成器。
迁移过程分为三个步骤,以避免对开发者的工作流程造成干扰:
- 第一步:将新的生成器与现有的基于 Buck 的解决方案集成,确保一切正常工作。
- 第二步:添加与 Buck 命令等效的 Bazel 命令,使开发者能够在两者之间切换。
- 第三步:在新的系统足够稳定后,移除对 Buck 的支持。
迁移成果
迁移后的成果显著:与 Buck 生成的项目相比,使用 XcodeGen 的生成时间减少了 60%,Xcode 的打开时间减少了 70% 以上。此外,基于 Bazel 的新构建系统还减少了构建时间,特别是在增量构建方面,并进一步优化了共享和协作效率。
如需了解更多细节,建议阅读原文。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。