QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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:005766

评论

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

Android C++系列:Linux线程(四)线程同步

轻口味

android 28天写作 12月日更

团队基建系列 - 组织知识传承 1

搬砖的周狮傅

团队成长

大厂算法面试之leetcode精讲23.并查集

全栈潇晨

算法 LeetCode

Linux云计算架构师:Linux全套实战学习资料

侠盗安全

Linux linux运维 运维工程师 云计算架构师 linux电子书

对话中国人寿:DevOps实践经验分享

龙智—DevSecOps解决方案

DevOps 中国人寿

Flutter开发:TextField常用属性的使用

三掌柜

28天写作 12月日更

学python,怎么能不学习scrapy呢,这篇博客带你学会它

梦想橡皮擦

12月日更

Java开发框架Struts相关知识分享

@零度

struts JAVA开发

高并发线下沙龙不容错过!

Qunar技术沙龙

高并发

喜报 | 旺链科技获批张江国家自主创新示范区专项发展资金!

旺链科技

区块链 数字经济 产业区块链

模块1作业

miliving

【LeetCode】截断句子Java题解

Albert

算法 LeetCode 12月日更

从微服务架构的现状和未来看学习路径

博文视点Broadview

全网最全-混合精度训练原理

科技热闻

给弟弟的信第5封|从高中到大学的体会

大菠萝

28天写作

华云大咖说 | 华云校园信创云解决方案

华云数据

华云数据

Prometheus Exporter (十九)Collectd Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Collectd

react源码解析17.context

buchila11

React React Hooks

Git进阶(十一):Git 常用操作汇总

No Silver Bullet

git 12月日更

使用 javap 分析 Java 的字符串操作

汪子熙

Java jdk 28天写作 12月日更 javac

元气部落盲盒芒趣一番赏盲盒app开发搭建

风行无疆

react源码解析18事件系统

buchila11

React React Hooks

网络协议之:基于UDP的高速数据传输协议UDT

程序那些事

TCP 网络协议 udp 程序那些事 12月日更

【量化】资产组合理论:鸡蛋不能放在一个篮子里

恒生LIGHT云社区

量化投资 量化

字节码引用检测原理与实战

vivo互联网技术

编程语言 字节码编程 引用

【HarmonyOS 专题】01 基础 Mac 环境安装配置

阿策小和尚

HarmonyOS 28天写作 Android 小菜鸟 12月日更

鸿蒙智联设备开发,这五大法宝你应该拥有|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

大厂算法面试之leetcode精讲24.其他类型题

全栈潇晨

算法 LeetCode

Go语言学习查缺补漏ing Day4

恒生LIGHT云社区

编程语言 Go 语言

Flutter 动画【Flutter专题16】

坚果

flutter 28天写作 签约计划第二季 12月日更

使用javap深入理解Java整型常量和整型变量的区别

汪子熙

Java jdk 28天写作 12月日更 javap

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