写点什么

Airbnb 从 Buck 迁移到 Bazel,大幅改善开发者体验

作者:Sergio De Simone

  • 2024-03-01
    北京
  • 本文字数:1196 字

    阅读完需:约 4 分钟

Airbnb从Buck 迁移到 Bazel,大幅改善开发者体验

随着其他组织将他们的构建管道迁移到 Bazel 之后,Airbnb 也发布了一个详细的说明,分享了他们弃用 Buck 并改善构建时间以及项目生成和加载时间的过程。


正如 Airbnb 的工程师 Qing Yang 和 Andy Bartholomew 所说的,转向 Bazel 是为了提供一种跨平台(包括后端和前端)统一而高效的构建体验。


从他们的 iOS 开发管道开始,Airbnb 的工程师们主要关注两个方面的问题:构建配置和 IDE 集成。


Bazel 和 Buck 有一些相似之处,包括相似的目录结构和命令行调用,最重要的是使用相同的配置语言 Starlark,这在某种程度上简化了构建配置的迁移。


尽管 Buck 和 Bazel 有相似之处,但它们在所提供的规则方面有所不同。


例如,Buck 提供了 apple_library 和 apple_binary 等规则,而 Bazel 根据外部规则集的不同提供了 swift_library 和 apple_framework 等规则。即使在两个系统具有相同名称的规则(例如 genrule)的情况下,用于配置这些规则的语法通常也是不同的。


在 Airbnb 的案例中,解决这个问题的方法是创建一个包装本地和外部规则的薄片(shim)层。为了在过渡阶段同时处理两个薄片,Airbnb 的工程师创建了一个包含两个不同目录rules_shim/buckrules_shim/bazel的存储库,然后为每个构建系统定义了一个规则,将rules_shim标识符与正确的目录关联起来。


rules_shim层也是处理 genrule 的关键。在 Airbnb,genrules 用于生成 iOS 代码库中的样板代码,并且在两个构建系统上有不同的语法。多亏了这个包装层,Airbnb 的工程师可以在两个系统中使用相同的 genrule 脚本。


构建配置所需的最后一个问题是支持条件配置。Buck 提供了一个read_config函数来读取命令行参数,而 Bazel 不支持这个函数,因此 Bazel 和 Buck 之间出现了不匹配。解决方案是向下移动一个抽象层,并通过select重新实现两个系统都支持的命令行参数。


在 IDE 集成方面,Airbnb 工程师的目标是用一个以 Bazel 为中心的解决方案替换他们现有的以 Buck 为中心的解决方案来创建 Xcode 项目,同时又可以使用他们围绕 Buck 开发所使用的工具。为了达到这个目的,他们决定使用 XcodeGen 开发自己的 Xcode 工作区生成器。


最重要的是,他们分三个步骤执行迁移过程,避免对开发人员的工作流造成干扰。第一步,将新的生成器与他们现有的基于 Buck 的解决方案集成,确保一切都按预期工作。在第二阶段,他们添加了新的 Bazel 命令,这些命令与 Buck 中使用的命令相同,并可以在两者之间切换。最后,在新系统看起来足够稳定时,他们移除了对 Buck 的支持。


迁移的最终结果令人印象深刻。与 Buck 生成项目相比,使用 XcodeGen 生成的时间缩短了 60%,Xcode 的打开时间缩短了 70% 以上。


除此之外,新的基于 Bazel 的构建系统缩短了构建时间,特别增量构建时间,并支持进行进一步优化,以改善共享和协作流程。如果你对完整的细节感兴趣,请务必阅读原文。


查看英文原文


https://www.infoq.com/news/2024/02/airbnb-bazel-migration-ios/

2024-03-01 10:005862

评论

发布
暂无评论
发现更多内容

架构师训练营练习:食堂就餐卡系统设计

Shawn

软件建模与设计文档

大雄

UML

mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比,于是写了个插件。

why技术

Java 源码 mybatis

scala callback hell

HackMSF

编程 最佳实践

程序员的晚餐 | 6 月 7 日 豆腐年糕

清远

美食

第一周作业

andy

ngrok穿越本地服务器,极客大学架构师训练营 第一课总结,John 易筋 ARTS打卡Week 03

John(易筋)

极客时间 极客大学 ngrok

ARTS 打卡 WEEK3

编程之心

ARTS 打卡计划

带你学够浪:Go语言基础系列 - 8分钟学复合类型

程序员柠檬

后端 Go 语言

MySQL 笔记(二)日志系统

奈何花开

Java MySQL

第一周UML作业

吴建中

HBase 常用 Shell 命令手册

Rayjun

Java HBase

ARTS打卡Week 03

teoking

ios LeetCode

使用 Docker Desktop 中的 Kubernetes

FeiLong

Docker Kubernetes

年龄性别的问题,好像也不是太大问题……

zhoo299

生活 随笔

SpringBoot整合Quartz实现任务定时

北漂码农有话说

SpringBoot 2

面试了 6 轮 Google中国 之后,还是挂了

程序猿石头

面试 谷歌Google 经验分享 面经

架构文档-作业01

ashuai1106

UML

史上最诡异问题,iOS 单例初始化两次,你遇到过吗?

liu_liu

ios 初始化 单例 两次

ARTS-WEEK1

Allen

食堂就餐卡系统设计

大雄

作业1-食堂就餐卡系统设计

A Matt

ARTS-week-2

youngitachi

ARTS 打卡计划

架构师训练营-学习笔记-第一周

心在飞

极客大学架构师训练营

图解Java垃圾回收算法及详细过程!

攀岩飞鱼

Java JVM 虚拟机 垃圾回收机制

极客时间 - 架构师训练营 - week1 - 作业2

jjn0703

极客大学架构师训练营

第一周学习总结

A Matt

极客大学架构师训练营

[安利] WSL Linux 子系统,真香!附完整实操

猴哥一一 cium

Docker Linux 推荐 WSL2 Windows 10

ARTS-02

NIMO

ARTS 打卡计划 ARTS活动

公司出了一款新产品,要不要招代理商?

石云升

用户增长 价值网依赖 产品定位 新产品

第一周总结

andy

第一周总结

Airbnb从Buck 迁移到 Bazel,大幅改善开发者体验_后端_InfoQ精选文章