到底什么是“Bazel 生态系统”?
Source: Dev.to
Bazel: The build engine at the core
在中心的是 Bazel 本身:一个由 Google 的 Blaze 团队最初开源的开源构建和测试工具。
- 读取你的
BUILD、WORKSPACE或MODULE.bazel文件。 - 分析依赖关系并创建动作图(action graph)。
- 只执行必要的步骤,重度使用并行和缓存,以保持构建快速且可复现。
把它想象成整个 monorepo 构建图的“编译器”。
Rules and Starlark: How Bazel understands your world
单独的 Bazel 知道如何调度工作,但它并不知道“构建一个 Java 库”或“构建一个 Docker 镜像”是什么意思。这些知识存在于 rules(规则)中,由 Starlark 语言编写。
你会看到两大类:
- 内置规则 – 用于 Java、C++、Go、Android、通用
genrule等。 - 外部规则集 – 社区和官方仓库,如
rules_python、rules_go、rules_docker、rules_k8s,以及在 Awesome Bazel 中整理的更多规则。
如果你的团队说“我们使用 Bazel”,他们真正的意思是“我们使用 Bazel 加上一套让它了解我们技术栈的规则”。
Toolchains, platforms, and remote builds
现代系统需要为多个平台构建,有时还要将繁重的工作卸载到远程集群。Bazel 生态系统也覆盖了这些需求。
关键组成
- 平台 & 工具链 – 描述操作系统/CPU 以及要使用的编译器和工具。这使得跨平台编译和多平台构建可以通过单一配置实现。
- 远程缓存 & 远程执行 – 可选服务,构建动作和输出可以在远程执行并缓存,这样大型团队就不会一次又一次地重复构建相同的内容。
这正是 Bazel 从“另一个构建工具”转变为“规模化构建与测试基础设施”的地方。
Developer tooling: Making Bazel pleasant to use
原始的 Bazel 可能感觉底层。生态系统通过配套工具让使用体验更顺畅。
典型示例
- Bazelisk 和包装 CLI,用于管理 Bazel 版本并引导工作区。
- 为 IntelliJ、VS Code、Android Studio 和 Xcode 生成的 IDE 集成,提供代码导航和重构功能,基于 Bazel 构建。
- 辅助工具如
bazel-diff、项目生成器、CI 集成以及在 Spotify、Atlassian 等公司使用的仓库特定实用工具。
这些工具把 Bazel 从“强大但痛苦”转变为团队可以在整个组织中采用的方案。
Community, examples, and real‑world usage
生态系统的强大取决于其社区。Bazel 开源项目得到了越来越多使用它进行大规模、多语言 monorepo 的公司和 OSS 项目的支持。
- 像 Awesome Bazel 这样的精选列表收集了规则、工具和示例项目(从 TensorFlow 到 Kubernetes 和 Envoy),帮助你了解他人是如何组织真实的 Bazel 工作区的。
- 围绕“下一代 Bazel 构建”和远程分析的博客、演讲和培训材料不断涌现,并保持与当今 Bazel 生态系统的兼容,以复用这些丰富的工具。
如果你在评估 Bazel,不要只看核心二进制文件。还要关注你将依赖的规则、开发者每天会使用的工具以及可以学习的社区资源。整个套件才是人们在谈论 Bazel 生态系统时真正指的内容。