ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

brpc 以 Bazel 第三方依赖接入:从 WORKSPACE 配置到链接目标的完整实战指南

brpc 以 Bazel 第三方依赖接入:从 WORKSPACE 配置到链接目标的完整实战指南 【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址https://gitcode.com/gh_mirrors/brpc3/brpc点击查看免费下载Apache brpc 是一个用 C 编写的工业级 RPC 框架源码与构建产物天然为 CMake 体系设计其官方 Bazel 支持以第三方依赖形态交付。本文基于仓库中的 docs/cn/bazel_support.md 及配套示例目录展开完整讲解为什么 bRPC 需要手动补齐部分依赖、如何把brpc_workspace.bzl与各.BUILD文件搬入你的项目、如何在 WORKSPACE 中注册依赖、以及最终在 BUILD 文件里通过apache_brpc//:bthread等目标完成链接。读完本文你可以在一小时内把 bRPC 作为 Bazel 外部依赖接入自己的 C 项目并成功构建出可运行的可执行文件。一、背景为什么 bRPC 作为 Bazel 依赖需要手动补齐Bazel 通过 WORKSPACE 声明外部仓库external repository而每个外部仓库都必须能被 Bazel 识别要么该仓库自带BUILD/BUILD.bazel文件要么由使用方提供独立的*.BUILD文件。bRPC 自身依赖了 protobuf、leveldb、zlib、gflags、OpenSSL 等一批开源库而这些库尤其是其中的 C 库与历史版本大多没有随上游源码提供 Bazel 构建描述。文档第一条明确指出了这一点bRPC 依赖于一些开源库, 但这些库并没有提供 bazel 支持, 所以需要你手动将一部分依赖加入到你的构建项目中。这正是 bRPC 的 Bazel 接入无法做到一条http_archive搞定的根本原因。仓库通过 example/build_with_bazel/ 目录给出了官方认可的解法用一套手工编写的.BUILD文件把没有 Bazel 支持的依赖补上构建描述再用一个brpc_workspace.bzl把整个依赖注册过程封装成一个可复用的 Bazel 函数。二、三步接入流程总览文档给出的接入流程可以归纳为三步步骤操作涉及文件1复制依赖构建描述文件到项目根目录*.BUILD见下方清单2复制并调用brpc_workspace()函数brpc_workspace.bzl、WORKSPACE3在目标 BUILD 文件中声明链接依赖你自己的BUILD/BUILD.bazel其中步骤 1 与步骤 2 是一次性的仓库级配置步骤 3 是每个使用 bRPC 的编译目标都要做的事。下面逐一展开。三、步骤一复制.BUILD文件到项目根目录需要复制的文件全部位于仓库的 example/build_with_bazel/ 目录下包括protobuf.BUILD为 protobuf 3.19.1 提供cc_library(protobuf)、cc_library(protobuf_lite)、cc_library(protoc)、cc_library(protoc_lib)等目标并裁剪了上游 BUILD 中非 C 的规则leveldb.BUILD为 leveldb 指定版本提供cc_library(leveldb)内含完整的 db/、table/、util/、port/ 源码清单zlib.BUILD为 zlib 1.2.11 提供cc_library(zlib)openssl.BUILD为系统安装的 OpenSSL 提供cc_library(crypto)与cc_library(ssl)两个薄封装目标brpc_workspace.bzl封装所有外部仓库注册逻辑的 Starlark 文件。从源码看这些.BUILD文件都以package(default_visibility [//visibility:public])开头见 example/build_with_bazel/leveldb.BUILD保证子项目任意包都能引用其中的目标。3.1 为什么是移动到项目根目录brpc_workspace.bzl内部使用build_file //:protobuf.BUILD这样的标签来引用.BUILD文件见 example/build_with_bazel/brpc_workspace.bzl。//:xxx是当前仓库根包的写法因此这些.BUILD文件必须与你的 WORKSPACE 同级位于项目根目录否则标签解析会失败。这是官方设计上的硬性约定不能随意挪到子目录。四、步骤二在 WORKSPACE 中注册brpc_workspace()将文件就位后在项目根目录的WORKSPACE文件中追加文档给出的两行load(//:brpc_workspace.bzl, brpc_workspace) brpc_workspace();load(//:brpc_workspace.bzl, ...)从当前仓库//根包加载brpc_workspace.bzl中的brpc_workspace符号brpc_workspace()一次性完成所有外部依赖的注册。仓库自带的官方示例 example/build_with_bazel/WORKSPACE 正是这样写的workspace(name brpc_test) load(//:brpc_workspace.bzl, brpc_workspace) brpc_workspace();需要说明的是示例使用的是经典 WORKSPACE 体系workspace()声明如果你的项目启用了 Bzlmod需要把brpc_workspace()的注册内容迁移到WORKSPACE.bzlmod对应的模块依赖机制中这一点下文第五节会进一步解释。五、深入brpc_workspace.bzl依赖注册的完整清单brpc_workspace()是整个接入方案的核心。对照 example/build_with_bazel/brpc_workspace.bzl它依次注册了以下外部仓库外部仓库名获取方式版本 / 提交构建文件用途bazel_skylibhttp_archive1.1.1自带Starlark 通用工具库com_google_protobufhttp_archiveprotobuf-3.19.1//:protobuf.BUILD序列化与 RPC 消息com_github_google_leveldbhttp_archive提交a53934a...//:leveldb.BUILD持久化存储com_github_madler_zlibhttp_archivezlib-1.2.11//:zlib.BUILD压缩opensslnew_local_repository系统/usr安装版//:openssl.BUILDTLS/加密com_github_gflags_gflagshttp_archive提交46f73f8...自带命令行参数apache_brpchttp_archivebrpc-1.3.0自带bRPC 仓库根 BUILD.bazelbRPC 本体几个值得注意的实现细节protobuf 需要打补丁。brpc_workspace.bzl对 protobuf 使用了patch_cmds/patch_cmds_win删除protobuf.bzl中第 4 行与 417~508 行之间与 C 构建无关的规则example/build_with_bazel/brpc_workspace.bzl使其能被精简版protobuf.BUILD正确加载Windows 下则通过 PowerShell 等价操作实现patch_cmds_win说明该方案同时考虑了 Linux/macOS 与 Windows 环境。OpenSSL 直接复用系统安装。openssl通过native.new_local_repository(name openssl, path /usr, build_file //:openssl.BUILD)指向本机/usrexample/build_with_bazel/brpc_workspace.bzl即依赖系统级 OpenSSL 头文件与动态库。对应地example/build_with_bazel/openssl.BUILD 在非 macOS 平台通过linkopts [-lcrypto]/[-lssl]直接链接系统库仅在 macOS 下改为链接/usr下的libcrypto.dylib/libssl.dylib。这意味着构建机必须预先安装 OpenSSL 开发包。bRPC 本体自带 BUILD 文件。apache_brpc直接http_archive拉取 brpc-1.3.0 源码包example/build_with_bazel/brpc_workspace.bzl该包自带仓库根目录的BUILD.bazel无需外部提供.BUILD。校验与来源。protobuf、zlib 均给出了sha256固定校验和所有仓库均使用固定版本号或固定 commit 的strip_prefix快照保证构建可复现。六、步骤三在 BUILD 文件中链接 bRPC 目标接入的最后一步是在需要使用 bRPC 的编译目标中声明依赖。文档给出的链接清单为... deps [ apache_brpc//:bthread, apache_brpc//:brpc, apache_brpc//:butil, apache_brpc//:bvar, ] ...这 4 个目标都定义在 bRPC 仓库根目录的 BUILD.bazel 中其依赖关系为apache_brpc//:butil基础工具库直接依赖 gflags、zlib、protobuf 以及 OpenSSL/BoringSSL见 BUILD.bazelapache_brpc//:bvar多线程计数器与指标库依赖:butil见 BUILD.bazelapache_brpc//:bthreadM:N 协程调度库依赖:butil与:bvar见 BUILD.bazelapache_brpc//:brpcRPC 框架本体依赖:bthread、:butil、:bvar、:json2pb、:mcpack2pb、leveldb 及内部 proto见 BUILD.bazel。从上述依赖关系可以看出apache_brpc//:brpc本身已经传递性地包含了 bthread/butil/bvar文档同时列出全部 4 个目标是为了显式声明、便于读者按需取用例如只用 bthread 写协程程序时可以只依赖apache_brpc//:bthread避免链接整个 RPC 框架。另外BUILD.bazel 通过//bazel/config:brpc_with_thrift的select支持按配置开关启用 thrift 协议支持brpc目标的deps中也包含相应的select分支说明 bRPC 的 Bazel 目标支持通过 config_setting 做特性裁剪。6.1 官方示例一个完整的可构建样例仓库在 example/build_with_bazel/BUILD.bazel 给出了完整可运行的示例目标cc_binary( name test, srcs [test.cc], deps [ apache_brpc//:brpc, apache_brpc//:bthread, apache_brpc//:bvar, apache_brpc//:butil, ], )对应源码 example/build_with_bazel/test.cc 只使用 bthread 启动一个后台协程并打印I Love bRPC#include bthread/bthread.h void *PrintHellobRPC(void *arg) { printf(I Love bRPC); return nullptr; } int main(int argc, char **argv) { bthread_t th_1; bthread_start_background(th_1, nullptr, PrintHellobRPC, nullptr); bthread_join(th_1, nullptr); return 0; }6.2 从零到一的实操命令假设你把上述 6 个文件brpc_workspace.bzl 4 个.BUILD与 WORKSPACE 配置就位、并写好自己的BUILD.bazel之后构建命令为# 首次构建会自动拉取 protobuf/leveldb/zlib/gflags/brpc 等所有外部仓库 bazel build //:test # 运行产物 bazel run //:testbazel build期间 Bazel 会依据brpc_workspace.bzl中的sha256校验下载的源码包并从系统/usr链接 OpenSSL。七、注意事项与适用前提OpenSSL 依赖系统安装由于openssl是new_local_repository(path /usr)构建环境必须已安装 OpenSSL 头文件与库Linux 通常为libssl-dev/openssl-devel。若你的环境把 OpenSSL 装在非默认路径需要修改brpc_workspace.bzl中的path参数。版本锁定示例把 bRPC 固定为 1.3.0、protobuf 固定为 3.19.1、zlib 固定为 1.2.11。文档描述的是作为第三方依赖接入的标准姿势——在你自己项目里bRPC 是作为apache_brpc外部仓库被拉取的而不是直接编译当前仓库源码。WORKSPACE 体系 vs Bzlmod示例工程 example/build_with_bazel/WORKSPACE 使用经典workspace()体系仓库根目录同时存在 WORKSPACE.bzlmod当前为空文件与根 WORKSPACE说明 bRPC 仓库本身正处于从经典 WORKSPACE 向 Bzlmod 迁移的过渡阶段。如果你的项目启用了 Bzlmod需要在MODULE.bazel中声明apache_brpc等依赖并把brpc_workspace.bzl中的http_archive逻辑迁移为archive_override/local_path_override等模块机制——目前官方示例仍以经典 WORKSPACE 为准。bRPC 仓库自身的 Bazel 构建若你想直接在当前仓库源码上做 Bazel 构建与单测仓库根目录的 BUILD.bazel 与 test/BUILD.bazel、bazel/config/BUILD.bazel 提供了完整的内部构建与测试目标包括brpc_build_for_unittest、brpc_with_glog、brpc_with_boringssl等 config_setting可参考 bazel/third_party/BUILD.bazel 下各依赖的 BUILD 定义。这与本文第三方依赖接入的用法互补前者把 bRPC 当作品来构建后者把 bRPC 当作库来消费。八、小结bRPC 的 Bazel 接入方案可以概括为一份 Starlark 脚本 四个 BUILD 文件 一段 deps 清单brpc_workspace()负责把 protobuf、leveldb、zlib、gflags、OpenSSL 与 bRPC 本体注册进你的构建图.BUILD文件为不提供 Bazel 支持的上游库补上构建描述最终通过apache_brpc//:brpc等 4 个公开目标链接进你的cc_binary/cc_library。这套方案完整、可复现且被官方示例 example/build_with_bazel/ 直接验证是 C 项目在 Bazel 体系下消费 bRPC 的首选路径。赞分享【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址https://gitcode.com/gh_mirrors/brpc3/brpc点击查看免费下载相关推荐Apache bRPC 作为 Bazel 第三方依赖接入指南WORKSPACE 配置、依赖管理与实践示例Apache bRPC 作为 Bazel 第三方依赖接入指南WORKSPACE 配置、依赖管理与实践示例 本文围绕官方文档 docs/en/bazel_supRPC框架后端微服务网络通信Apache bRPC 的 Bazel 构建支持与第三方依赖接入实战指南Apache bRPC 的 Bazel 构建支持与第三方依赖接入实战指南 本文基于仓库 docs/cn/bazel_support.md https://lin示例工程JustAuth 第三方授权登录组件快速接入指南从 Maven 依赖到 Builder 动态配置实战JustAuth 第三方授权登录组件快速接入指南从 Maven 依赖到 Builder 动态配置实战 本文以仓库根目录 README.md https://l后端认证鉴权上一篇告别手动配置ComfyUI-Manager节点安装脚本全自动开发指南下一篇Livewire 组件完全指南创建、渲染与组织的三种格式与命名空间详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进