写点什么

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

评论

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

CSS之选择器(六)::before和::after

Augus

CSS 12月日更

依赖 jar 没有传递,导致找不到类文件而启动失败了

程序员小航

Java maven

潮玩盲盒系统开发元气部落盲盒app开发

风行无疆

进程ID及进程间的关系

mazhen

Linux Shell Linux Kenel

基于融云直播 SDK,快速实现连麦布局

融云 RongCloud

融云直播 SDK 2.0 重磅上线,两步接入即可获得视频直播能力

融云 RongCloud

架构设计之MQ选型

无心水

RocketMQ MQ RabbitMQ Kakfa Activemq

2021年12月国产数据库排行榜: openGauss节节攀升拿下榜眼,GaussDB与TDSQL你争我夺各进一位

墨天轮

数据库 opengauss TiDB 国产数据库

解决远程办公安全隐患,就用行云管家!

行云管家

远程办公 IT运维

你怎么总是能写出两三千行的controller类?

CRMEB

Flutter流畅度优化神器-开源组件keframe详解

贝壳大前端技术团队

flutter 性能 滑动优化

CODING x 百果园,水果零售龙头迈出 DevOps 体系建设第一步

CODING DevOps

DevOps CODING 百果园 合作

Aeron 是如何实现的?—— Ipc 异常情况处理

BUG侦探

Aeron ipc

【HZERO微服务平台6】源码分析之数据权限、sql拦截

qiaoxingxing

签约计划第二季

记录一次win10更新版本后IIS无法启动的解决办法

为自己带盐

28天写作 12月日更

重磅!中国红十字基金会固生堂中医惠民专项基金成立

E科讯

人工成本上升+设备停机率高,制造企业该如何破而后立?

优秀

低代码 制造业

前端需要的免费在线api接口

德育处主任

JavaScript ajax 前端 Postman API

声网把七年无全网事故的实时传输网络SD-RTN全面开放了——这就是FPA!

声网

人工智能 网络 SD-RTN

【软件开发】直播带货App如何开发

青山一叶秋

【修复升级】腾讯容器安全首个发布开源 Log4j2 漏洞缓解工具

腾讯安全云鼎实验室

可视化神器背后的奥秘

百度开发者中心

大数据 百度开发者沙龙

斗罗大陆真3D手游实力上线,带你感受魂兽猎杀的超燃时刻

华为云开发者联盟

数据库 华为云数据库 rds for mysql 3D手游 PITR

微服务架构 | 如何利用好日志链路追踪做性能分析?

李尚智

Java 链路追踪 微服务治理 性能调试 微服务调用链

Flutter for Web 在贝壳容灾降级中的应用

贝壳大前端技术团队

flutter 容灾 降级 flutter for web

你想知道的Kotlin version

Changing Lin

12月日更

一张图看懂融云直播 SDK

融云 RongCloud

iOS内卷面试题-你以为你够卷了,面试官更卷!

iOSer

ios 内卷 iOS面试

工业企业能耗在线监测系统开发建设

a13823115807

行云管家荣获第二届国际科创节“2021年度高成长性企业奖”!

行云管家

云计算 混合云 IT运维

元宇宙时代的业务、场景、技术机遇探索

融云 RongCloud

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