You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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仓库,按以下步骤修改即可:

  1. 在项目根目录的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()
  1. 调整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
  1. 执行缓存清理避免旧配置干扰:
bazel clean --expunge
  1. 重新执行Gazelle生成BUILD文件、构建二进制的流程即可正常构建。

内容的提问来源于stack exchange,提问作者IhtkaS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:36:04