如何在Bazel构建的Go仓库中解决EnvoyProxy validate规则的Proto依赖问题
问题描述
使用Bazel和Gazelle工具构建包含预生成Proto文件的大型Golang仓库时,在Proto定义中使用EnvoyProxy的validate规则后,Bazel无法正常构建仓库。未引入该依赖时Bazel可成功构建Go包,引入后报错。
复现步骤
构建仓库按以下流程执行:
- 构建仓库前先生成Proto文件:
protoc -I=. -I ~/go/pkg/mod/github.com/envoyproxy/protoc-gen-validate@v0.6.1 --go_out=./../../../ --validate_out="lang=go:./../../../" --go-grpc_out=./../../../ ./protos/pinger/service.proto
- 使用Gazelle生成依赖:
bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=deps.bzl%go_dependencies -build_file_proto_mode=disable_global -prune
- 使用Gazelle生成BUILD.bazel文件:
bazel run //:gazelle
- 构建pinger Go二进制文件:
bazel build //cmd/pinger
报错信息
go/src/github.com/ihtkas/bazel-gazelle-ex/api/pinger/BUILD.bazel:3:11:
error loading package
'@com_github_envoyproxy_protoc_gen_validate//validate': Unable to find
package for @com_google_protobuf//:protobuf.bzl: The repository
'@com_google_protobuf' could not be resolved. and referenced by
'//api/pinger:pinger' ERROR: Analysis of target '//cmd/pinger:pinger'
failed; build aborted: Analysis failed
解决方案
该报错根源是Gazelle仅从go.mod同步Go语言依赖,不会自动拉取protoc-gen-validate依赖的Bazel原生protobuf仓库,按以下步骤修改即可:
- 在项目根目录的
WORKSPACE文件中手动添加protobuf和protoc-gen-validate的Bazel仓库声明,以及对应的依赖加载逻辑,避免依赖缺失:
# 加入到WORKSPACE文件开头,其他go相关依赖加载之前 http_archive( name = "com_google_protobuf", sha256 = "6a6273af59ad51c038a7b382fe7717bc7075b94b52c6dfc840983bdf4980c665", strip_prefix = "protobuf-25.3", urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v25.3/protobuf-25.3.tar.gz"], ) http_archive( name = "com_github_envoyproxy_protoc_gen_validate", sha256 = "6e0275c93b1392b11d2351b4e82a0326c8a4d4c5c054098f169017c71c8c9335", strip_prefix = "protoc-gen-validate-0.6.1", urls = ["https://github.com/envoyproxy/protoc-gen-validate/archive/refs/tags/v0.6.1.tar.gz"], ) # 加载两个依赖的子依赖 load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() load("@com_github_envoyproxy_protoc_gen_validate//:deps.bzl", "pgv_deps") pgv_deps()
- 调整Gazelle依赖同步命令,排除protoc-gen-validate和protobuf,避免Gazelle自动覆盖手动声明的仓库配置:
bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=deps.bzl%go_dependencies -build_file_proto_mode=disable_global -prune -exclude=github.com/envoyproxy/protoc-gen-validate -exclude=google.golang.org/protobuf
- 执行缓存清理避免旧配置干扰:
bazel clean --expunge
- 重新执行Gazelle生成BUILD文件、构建二进制的流程即可正常构建。
内容的提问来源于stack exchange,提问作者IhtkaS
相关产品推荐
相关产品推荐

