“复杂依赖”的 Chromium 管理之道

2025-12-11 pv

Chromium 不是一个软件。

至少从代码层面,它更像是一组软件的集合。

除了自身开发的代码外,还有很多第三方依赖,被置于 third_party 目录。

管理自己尚且如此不易,管理别人,就更难了。

这其中,涉及到不同软件项目的独立开发、版本管理、兼容测试。牵涉到的项目一多,管理的难度难免呈指数上升。

在与复杂形势的斗争中,Chromium 逐渐形成了一套自己的管理智慧。

1. 依赖有哪些

Chromium 是个历史悠久的软件项目,诞生于 2008 年。

依赖超过 上千个 外部组件:

  • V8 JavaScript 引擎
  • Skia 渲染库
  • FFmpeg 多媒体库
  • ICU 文本处理
  • Angle / Dawn GPU 库
  • 各类 OS 原生 SDK
  • SeaMonkey、libwebp、woff2……

那么问题来了。

这些组件各自都有维护团队,授权方式、版本策略、甚至开发节奏,各不相同。

和日常生活中情侣相处一样,改变别人是困难的,只能改变自己。

为了保证这个巨大的软件生态系统 长期可控、可编译、可审计,Chromium 必须解决以下问题:

  • 可复现构建(Reproducible Build)
  • 版本可控
  • 安全补丁及时更新
  • 跨平台可正常工作

2. 如何管理

其实可以看的出来,这本质是个 包管理 问题。

很多现代语言,都有成熟且通用的包管理工具,比如 Python 有 pip,JavaScript 有 npm 等。

古老的 C++ 在这方面是欠缺的。

尽管有 make、CMake,包括微软主导的 C/C++ 依赖管理器 vcpkg 作为补充,可应用于小型工程,但像 Chromium 这个体量的,没有。

Chromium 再次决定自己动手。

用到四个工具:

  • DEPS 文件,定义依赖
  • gclient,拉取依赖
  • third_party,依赖的本地存放路径
  • tools/autoroll,自动升级

Chromium 根目录下有一个 DEPS 文件,包含:

  • 依赖的 repo 地址
  • 使用的 revision(精准的 commit ID)
  • 各平台差异(OS 选择、条件判断)
  • hooks(依赖拉取后的额外动作)
  • CIPD 包(Google 内部打包的预编译二进制)

格式是个 Python 文件,通过 commit id 锁定版本。

deps = {
"src/v8": {
"url": "https://chromium.googlesource.com/v8/v8.git",
"rev": "abcdef123456...",
},
"src/third_party/skia": "https://skia.googlesource.com/skia.git@deadbeef",
}

gclient 负责把 DEPS 里定义的依赖下载到本地。

执行 gclient sync 相当于:

  1. 解析 DEPS
  2. clone 或 update 子仓库
  3. 下载 CIPD 二进制文件
  4. 执行 hooks

Chromium 将外部组件放置在 third_party 目录下统一管理,其中包含:

  • 纯源码仓库(如 Skia、Ffmpeg)
  • 仅包含构建脚本,源码另行下载(如 Clang、Swiftshader)
  • CIPD 提供的预编译 binary
  • 多平台分发的资源文件

只要更新 DEPS 文件,再执行 gclient sync,便可实现本地依赖的同步更新。

但是,手工维护 DEPS 是困难的,并且容易出错,AutoRoll 用来创建并管理该文件。

它可以自动地:

  • 检测 upstream 依赖是否更新
  • 创建 roll CL
  • 触发编译 & 测试
  • 自动合入或等待 review

Chromium 仅仅通过 4 个工具,和一套清晰的流程,便解决了这个复杂依赖的管理问题

3. 借鉴

我认为 Chromium 在解决这个问题的过程中,有三点值得借鉴:

  1. 抓住不变量
  2. 定义流程
  3. 利用工具

几千个依赖项,时刻都在变化,什么是不变的?

目前几乎所有的软件项目,都在用 git 管理版本,commit id 一定对应某个特定版本,且永久固定。

版本的概念,便被映射到一个具体的 commit id

另外,越是复杂的问题,越是依赖流程、机制,人往往靠不住。

至于工具的出现,自然是为了更加高效地解决问题。

4. 总结

在 Chromium 眼里,所有的问题,都可以通过”流程 + 工具“解决

当大部分流程都可以被自动化的时候,问题就变得异常简单,人的双手得以解放。

这是一种富有智慧的思维方式。

以后当你遇到问题时,不妨想一想,可不可以利用工具,将解决过程自动化。

只有这样,你的时间、精力、生活,才有可能从重复性的劳动中解脱出来。

自由的边界,又向前拓宽了那么一点点。

(完)

参考

  1. Chromium Docs - Managing Chromium dependencies🔗
  2. Chromium - 维基百科,自由的百科全书🔗
  3. vcpkg - Open source C/C++ dependency manager from Microsoft🔗
  4. AutoRoll🔗
在 GitHub 上编辑本页面

最后更新于: 2025-12-11T06:17:33+08:00