写点什么

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

评论

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

智能合约佛萨奇系统开发,佛萨奇2.0源码搭建

薇電13242772558

OpenHarmony标准系统内核学习【2】CPU轻量级隔离特性

离北况归

OpenHarmony

如何通过jstat命令进行查看堆内存使用情况

华为云开发者联盟

后端 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

聊聊Docker镜像

天翼云开发者社区

Docker 镜像

一文教你如何重新认识用户

蔡农曰

互联网 产品经理 消费者 需求设计

MySQL中的distinct和group by哪个效率更高?

Steven

基于GIS+WebGL智慧消防3D可视化云控系统

2D3D前端可视化开发

智慧消防 消防物联网云平台 消防三维可视化 智慧消防系统 消防云控平台

线上网络丢包引起的接口响应时间过慢,快速排查案例

KINDLING

Java 运维 网络 丢包 eBPF&Linux

APISIX Ingress 如何使用 Cert Manager 管理证书

API7.ai 技术团队

证书 api 网关 APISIX Ingress Controller

实战分享 | 金融数据采集报送平台实践

葡萄城技术团队

单线程架构的Redis如此之快的 4 个原因

JAVA旭阳

redis 缓存

工业生产环境下,时序数据库 TDengine 如何打造全面有效的数字化监控?

TDengine

数据库 tdengine 时序数据库

新年新气象,老兵开新坑

致知Fighting

Java Go 服务器

泰山众筹sun4.0矩阵合约系统开发搭建

开发微hkkf5566

全球化安全生产 & 质量保障体系建设探索

阿里技术

质量保障 安全生产 全球化技术能力

LeaRun快速开发平台:自由搭建个性化门户

力软低代码开发平台

易观千帆 | 12月用户体验GX评测:国有行及股份行持续领跑,农信社用户体验关注提升

易观分析

金融 手机银行

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

阿里巴巴云原生

阿里云 云原生 云原生容器

浪潮云:以数据云IBP释放数据要素力量

云计算 数据云

行云洞见|为何行业权威都预测“云原生IDE 将成为常态”?

行云创新

ide 云原生 云端IDE Cloud IDE TitanIDE

谈谈我工作中的23个设计模式

阿里巴巴中间件

阿里云 云原生

单线程 Redis 如此之快的 4 个原因

C++后台开发

redis 中间件 后端开发 单线程 C++开发

RocketMQ Streams拓扑构建与数据处理过程

Apache RocketMQ

RocketMQ 消息列队

NFTScan 正式上线 Fantom 网络 NFTScan 浏览器和 NFT API 数据服务

NFT Research

NFT 数据基础设施

统一观测丨如何使用 Prometheus 监控 MySQL

阿里巴巴云原生

MySQL 阿里云 云原生 #Prometheus

理论+实践,教你如何使用Nginx实现限流

华为云开发者联盟

后端 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

简单概述Serverless

天翼云开发者社区

SparK 用稀疏掩码为卷积设计 Bert 预训练

Zilliz

计算机视觉

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