如何配置Bazel不静态嵌入外部依赖适配Debian等发行版打包要求
Bazel 适配 Debian 系发行版打包规范的落地方案
不需要放弃Bazel,官方原生机制就能完全满足替换外部依赖、链接系统共享库的要求。
依赖替换核心实现
使用Bazel内置的仓库覆写能力即可,不需要修改项目原有WORKSPACE中的依赖声明,也不需要魔改Bazel源码:
- 构建时通过
--override_repository启动参数,指定对应外部依赖的本地替换路径,该参数优先级高于WORKSPACE中配置的所有远程仓库规则,Bazel会直接跳过指定依赖的远程拉取、哈希校验流程,完全使用你本地准备的仓库内容。 - 以protobuf场景为例,构建命令写法如下:
bazel build //your:build_target --override_repository=com_github_protocolbuffers_protobuf=/path/to/your/local/protobuf_wrapper
本地替换仓库的制作方法
本地替换仓库不需要拷贝完整的依赖源码,只需要编写符合Bazel规则的BUILD文件,对外暴露和原远程仓库完全一致的target名称,指向系统安装的共享库和头文件即可,项目原有代码不需要做任何修改。
以protobuf的替换BUILD文件为例:
cc_library( name = "protobuf", srcs = ["/usr/lib/x86_64-linux-gnu/libprotobuf.so"], hdrs = glob(["/usr/include/google/protobuf/**/*.h"]), includes = ["/usr/include"], visibility = ["//visibility:public"], linkstatic = False, )
如果构建过程需要用到protoc编译器,也可以在同个BUILD文件里声明对应cc_binary规则指向系统安装的/usr/bin/protoc即可。
关于安全风险的说明
你提到的跳过哈希校验的安全隐患,在发行版打包场景下实际不存在:本地替换仓库由打包维护者自行管控,链接的系统共享库已经过发行版官方的安全审核、版本校验,不会引入不受信任的代码。
批量替换优化
如果需要替换的依赖较多,可以把所有覆写参数写到独立的bazelrc配置文件中(比如命名为debian_packaging.bazelrc),打包时指定加载该配置即可,不需要每次输入长串参数:
# debian_packaging.bazelrc 示例 build --override_repository=com_github_protocolbuffers_protobuf=./packaging/overrides/protobuf build --override_repository=com_google_absl=./packaging/overrides/absl build --override_repository=com_github_google_googletest=./packaging/overrides/gtest
构建时执行bazel build //your:build_target --bazelrc=debian_packaging.bazelrc就能自动加载所有替换规则。
内容的提问来源于stack exchange,提问作者David Given
相关产品推荐
相关产品推荐

