“复杂依赖”的 Chromium 管理之道
2025-12-11
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 相当于:
- 解析 DEPS
- clone 或 update 子仓库
- 下载 CIPD 二进制文件
- 执行 hooks
Chromium 将外部组件放置在 third_party 目录下统一管理,其中包含:
- 纯源码仓库(如 Skia、Ffmpeg)
- 仅包含构建脚本,源码另行下载(如 Clang、Swiftshader)
- CIPD 提供的预编译 binary
- 多平台分发的资源文件
只要更新 DEPS 文件,再执行 gclient sync,便可实现本地依赖的同步更新。
但是,手工维护 DEPS 是困难的,并且容易出错,AutoRoll 用来创建并管理该文件。
它可以自动地:
- 检测 upstream 依赖是否更新
- 创建 roll CL
- 触发编译 & 测试
- 自动合入或等待 review
Chromium 仅仅通过 4 个工具,和一套清晰的流程,便解决了这个复杂依赖的管理问题。
3. 借鉴
我认为 Chromium 在解决这个问题的过程中,有三点值得借鉴:
- 抓住不变量
- 定义流程
- 利用工具
几千个依赖项,时刻都在变化,什么是不变的?
目前几乎所有的软件项目,都在用 git 管理版本,commit id 一定对应某个特定版本,且永久固定。
版本的概念,便被映射到一个具体的 commit id。
另外,越是复杂的问题,越是依赖流程、机制,人往往靠不住。
至于工具的出现,自然是为了更加高效地解决问题。
4. 总结
在 Chromium 眼里,所有的问题,都可以通过”流程 + 工具“解决。
当大部分流程都可以被自动化的时候,问题就变得异常简单,人的双手得以解放。
这是一种富有智慧的思维方式。
以后当你遇到问题时,不妨想一想,可不可以利用工具,将解决过程自动化。
只有这样,你的时间、精力、生活,才有可能从重复性的劳动中解脱出来。
自由的边界,又向前拓宽了那么一点点。
(完)
参考
- 本文作者:Plantree
- 本文链接:https://plantree.me/blog/2025/chromium-dependencies/
- 版权声明:所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
最后更新于: 2025-12-11T06:17:33+08:00