执行bazel build :protoc :protobuf构建失败,请求排查解决
问题
执行bazel build :protoc :protobuf构建protobuf 21.5版本时失败,报错信息如下:
Starting local Bazel server and connecting to it... DEBUG: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_jvm_external/coursier.bzl:445:22: maven_install.json的输入已更改,但未重新生成锁定文件。建议运行'bazel run @unpinned_maven//:pin' ERROR: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/pkg/mappings.bzl:108:12: 名称'json'未定义 ERROR: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/pkg/mappings.bzl:224:22: 名称'json'未定义 ERROR: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/pkg/mappings.bzl:413:22: 名称'json'未定义 ERROR: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/pkg/mappings.bzl:473:22: 名称'json'未定义 INFO: Repository rules_proto实例化于: /home/wang/test_csh/protobuf-21.5/WORKSPACE:31:14: 在<toplevel>中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:73:24: 在protobuf_deps中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:19:17: 在_github_archive中 Repository rule http_archive定义于: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: 在<toplevel>中 INFO: Repository rules_cc实例化于: /home/wang/test_csh/protobuf-21.5/WORKSPACE:31:14: 在<toplevel>中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:57:24: 在protobuf_deps中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:19:17: 在_github_archive中 Repository rule http_archive定义于: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: 在<toplevel>中 INFO: Repository rules_java实例化于: /home/wang/test_csh/protobuf-21.5/WORKSPACE:31:14: 在<toplevel>中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:65:24: 在protobuf_deps中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:19:17: 在_github_archive中 Repository rule http_archive定义于: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: 在<toplevel>中 INFO: Repository rules_python实例化于: /home/wang/test_csh/protobuf-21.5/WORKSPACE:31:14: 在<toplevel>中 /home/wang/test_csh/protobuf-21.5/protobuf_deps.bzl:81:21: 在protobuf_deps中 Repository rule http_archive定义于: /root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: 在<toplevel>中 ERROR: 跳过':protoc': 加载包''失败: 在/root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/mappings.bzl中: 扩展'pkg/mappings.bzl'存在错误 ERROR: 加载包''失败: 在/root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/mappings.bzl中: 扩展'pkg/mappings.bzl'存在错误 INFO: 耗时: 11.787s INFO: 0个进程。 FAILED: 构建未成功完成(已加载1个包)
解决方案
1. 修复rules_pkg依赖版本
核心错误是rules_pkg的mappings.bzl文件缺失json模块导入,本质是依赖的rules_pkg版本与当前环境不兼容。直接指定兼容的rules_pkg版本:
- 打开
protobuf-21.5/protobuf_deps.bzl文件,找到rules_pkg的http_archive定义段 - 替换为兼容的固定版本:
http_archive( name = "rules_pkg", urls = ["https://github.com/bazelbuild/rules_pkg/releases/download/0.7.0/rules_pkg-0.7.0.tar.gz"], sha256 = "ccc4e56fec04f30e4a252937a378b452b8f652572e4c85a5620e4f8004f0f8e", ) - 清理Bazel缓存:
bazel clean --expunge
2. 临时补全json模块导入
若不想修改依赖版本,可手动补全缺失的导入:
- 打开报错文件
/root/.cache/bazel/_bazel_wang/181be6b67ee4902db879f2b646f0f657/external/rules_pkg/pkg/mappings.bzl - 在文件顶部添加:
load("@bazel_skylib//lib:json.bzl", "json") - 重新执行构建命令
3. 更新maven锁定文件
完成上述修复后,处理DEBUG提示的锁定文件问题:
bazel run @unpinned_maven//:pin
4. 验证Bazel版本兼容性
确保使用的Bazel版本与protobuf 21.5兼容,建议使用Bazel 5.x版本(protobuf 21.x官方推荐Bazel 5.0.0及以上)。
内容的提问来源于stack exchange,提问作者xiaoming
相关产品推荐
相关产品推荐

