Bazel下使用cc_proto_library、py_proto_library引入Well-Known Types报错如何解决
问题根因
你当前使用的Protobuf主分支已经重构了Bazel构建规则,废弃了旧版根路径下的well-known type目标定义,同时旧版@com_google_protobuf//:protobuf.bzl中的规则和新的目标结构不兼容,导致无法找到any_proto对应的生成目标。
可行解决方案
方案1:使用Bazel原生Proto规则(推荐)
原生规则和Protobuf主分支的新目标结构完全兼容,修改BUILD文件内容如下:
# 无需加载protobuf.bzl中的旧规则,直接使用Bazel原生规则 proto_library( name = "container_proto", srcs = ["container.proto"], visibility = ["//visibility:public"], # 替换为正确的any_proto目标路径 deps = ["@com_google_protobuf//google/protobuf:any_proto"], ) cc_proto_library( name = "container_cc_proto", visibility = ["//visibility:public"], deps = [":container_proto"], ) py_proto_library( name = "container_py_proto", visibility = ["//visibility:public"], deps = [":container_proto"], )
修改后直接执行原有构建命令即可正常编译。
方案2:保留旧规则,修改依赖路径
如果必须使用protobuf.bzl中的旧规则,只需将deps中的依赖替换为对应语言的well-known type目标即可:
load("@com_google_protobuf//:protobuf.bzl", "cc_proto_library") load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") cc_proto_library( name = "container_cc_proto", srcs = ["container.proto"], visibility = ["//visibility:public"], deps = ["@com_google_protobuf//google/protobuf:any_cc_proto"], ) py_proto_library( name = "container_py_proto", srcs = ["container.proto"], visibility = ["//visibility:public"], deps = ["@com_google_protobuf//google/protobuf:any_py_proto"], )
内容的提问来源于stack exchange,提问作者falsekeel
相关产品推荐
相关产品推荐

