通用的bazel workspace 模板
通用的bazel workspace 模板
以下是一个通用的 Bazel Workspace 模板,支持 C++/Python 混合项目、多平台构建、外部依赖管理和单元测试,适用于现代 C++(17/20)和 Python 3 项目:
WORKSPACE 文件:
# WORKSPACE 文件(项目根目录)
workspace(
name = "my_project",
managed_directories = {"@npm": ["node_modules"]}, # 可选:前端依赖管理
)
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
# ================ Bazel 版本和工具链 ================
# 强制 Bazel 最低版本
bazel_version = "7.0.0"
# ================ 外部依赖管理 ================
# 1. 规则集依赖
http_archive(
name = "rules_cc",
sha256 = "3d9e271e2876ba42e114c9b9bc51454e379cbf0ec9af9ed1d1f3d0e7b109b6b4",
urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz"],
)
http_archive(
name = "rules_python",
sha256 = "a30ab357c7314a805538d5a4c8ca8a9cad11f6e2e07e6a6e8c8e89e5a4d8b8e7",
urls = ["https://github.com/bazelbuild/rules_python/releases/download/0.25.0/rules_python-0.25.0.tar.gz"],
)
# 2. 第三方库(示例:spdlog)
http_archive(
name = "com_github_gabime_spdlog",
sha256 = "6fff9215f5cb81760be4cc16d033526d1080427d236e86d70bb02994f85e3d38",
strip_prefix = "spdlog-1.11.0",
urls = ["https://github.com/gabime/spdlog/archive/refs/tags/v1.11.0.tar.gz"],
)
# 3. 工具链配置(示例:Linux GCC)
load("@rules_cc//cc:defs.bzl", "cc_register_toolchains")
cc_register_toolchains(version = "12") # 使用系统 GCC 12
# ================ 本地依赖加载 ================
# 加载子模块(如果有)
local_repository(
name = "submodule",
path = "third_party/submodule",
)
# ================ 语言支持扩展 ================
# Python 环境配置
load("@rules_python//python:repositories.bzl", "python_register_toolchains")
python_register_toolchains(
name = "python3",
python_version = "3.10",
)
# ================ 项目配置 ================
load("//:version.bzl", "PROJECT_VERSION") # 从version.bzl加载版本号
BUILD 文件:
# BUILD 文件(示例:主程序)
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
# ================ C++ 主库 ================
cc_library(
name = "core",
srcs = glob([
"src/core/*.cpp",
]),
hdrs = glob([
"include/core/*.h",
]),
deps = [
"@com_github_gabime_spdlog//:spdlog",
],
copts = ["-std=c++17"],
visibility = ["//visibility:public"],
)
# ================ 可执行文件 ================
cc_binary(
name = "main",
srcs = ["src/main.cpp"],
deps = [":core"],
)
# ================ 单元测试 ================
cc_test(
name = "core_test",
srcs = ["tests/core_test.cpp"],
deps = [
":core",
"@com_google_googletest//:gtest_main",
],
)
# ================ Python 扩展(可选) ================
py_binary(
name = "py_tool",
srcs = ["tools/script.py"],
deps = [
requirement("numpy"),
],
)
.bazelrc 配置文件(可选)
公共构建选项
- build --cxxopt=-std=c++17
- build --host_cxxopt=-std=c++17
- build --copt=-Wall
- build --copt=-Wextra
平台特定配置
- build:linux --copt=-D_LINUX
- build:windows --copt=-D_WINDOWS
远程缓存配置(加速构建)
- build --remote_cache=grpc://buildcache.example.com
核心功能说明
| 模块 | 功能 |
|---|---|
| 依赖管理 | 支持 http_archive(源码下载)和系统工具链 |
| 多语言支持 | 同时支持 C++ 和 Python 构建 |
| 模块化设计 | 通过 cc_library 分离核心逻辑和可执行文件 |
| 测试集成 | 原生支持 cc_test 和 py_test |
| 跨平台构建 | 通过 .bazelrc 配置不同平台的编译选项 |
| 高性能构建 | 支持远程缓存(Remote Cache)和沙盒构建 |
项目结构建议
my_project/
├── WORKSPACE # Bazel 工作区定义
├── .bazelrc # 全局构建配置
├── BUILD # 根构建文件
├── src/
│ ├── core/ # 核心库源码
│ └── main.cpp # 主程序
├── include/
│ └── core/ # 公共头文件
├── tests/
│ └── core_test.cpp # 单元测试
└── tools/
└── script.py # Python 工具脚本
常用命令
# 构建主程序
bazel build //:main
# 运行程序
bazel run //:main
# 运行测试
bazel test //:core_test
# 构建所有目标
bazel build //...
# 清理构建缓存
bazel clean --expunge
高级功能扩展
1. 自定义工具链:
load("@rules_cc//cc:defs.bzl", "cc_toolchain")
cc_toolchain(
name = "custom_toolchain",
cpu = "k8",
compiler = "clang",
)
2. Docker 集成:
load("@io_bazel_rules_docker//cc:image.bzl", "cc_image")
cc_image(
name = "docker_image",
binary = ":main",
base = "@alpine_linux//image",
)
3. 前端集成(需安装 rules_nodejs):
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
nodejs_binary(
name = "frontend",
entry_point = "webpack.config.js",
)
此模板提供了现代 C++/Python 项目所需的基础设施,支持从单体应用到微服务架构的平滑扩展。根据实际需求调整依赖项和构建规则即可。

浙公网安备 33010602011771号