引入Google API依赖的Proto文件Bazel编译报错求助
Bazel编译含Google API Proto的自定义Proto报错排查
报错信息
23:31:22 (18:01:22) ERROR: /tmp/bazel-build/external/model_monitoring_api/BUILD.bazel:3:14: no such target '@go_googleapis//google/api:resource_proto': target 'resource_proto' not declared in package 'google/api' (did you mean 'resource.proto'?) defined by /tmp/bazel-build/external/go_googleapis/google/api/BUILD.bazel and referenced by '@model_monitoring_api//:monitoring_api_proto' 23:31:22 (18:01:22) ERROR: /tmp/bazel-build/external/model_monitoring_api/BUILD.bazel:3:14: no such target '@go_googleapis//google/api:field_behavior_proto': target 'field_behavior_proto' not declared in package 'google/api' (did you mean 'field_behavior.proto'?) defined by /tmp/bazel-build/external/go_googleapis/google/api/BUILD.bazel and referenced by '@model_monitoring_api//:monitoring_api_proto' 23:31:22 (18:01:22) ERROR: /tmp/bazel-build/external/model_monitoring_api/BUILD.bazel:3:14: no such target '@go_googleapis//google/api:client_proto': target 'client_proto' not declared in package 'google/api' (did you mean 'client.proto'?) defined by /tmp/bazel-build/external/go_googleapis/google/api/BUILD.bazel and referenced by '@model_monitoring_api//:monitoring_api_proto'
自定义Proto中的导入语句
import "google/api/annotations.proto"; import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/field_mask.proto";
当前Bazel构建文件内容
load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "monitoring_api_proto", srcs = glob(["v1/*.proto"]), visibility = ["//visibility:public"], deps = [ "@com_google_protobuf//:any_proto", "@com_google_protobuf//:duration_proto", "@com_google_protobuf//:empty_proto", "@com_google_protobuf//:field_mask_proto", "@com_google_protobuf//:timestamp_proto", "@go_googleapis//google/api:annotations_proto", "@go_googleapis//google/api:client_proto", "@go_googleapis//google/api:field_behavior_proto", "@go_googleapis//google/api:resource_proto", ], )
已尝试的操作
- 直接导入
.proto文件,出现Google API相关proto对Bazel目标不可见的报错 - 仅添加
@go_googleapis//google/api:annotations_proto到依赖中时无导入错误,但因缺少其他依赖导致编译失败
问题原因与解决方案
问题原因
报错提示的目标不存在,是因为@go_googleapis//google/api包内的client.proto、field_behavior.proto、resource.proto对应的proto_library目标名称不带_proto后缀,只有annotations.proto对应的目标是annotations_proto。
修改后的Bazel构建文件
将依赖中的错误目标名修正:
load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "monitoring_api_proto", srcs = glob(["v1/*.proto"]), visibility = ["//visibility:public"], deps = [ "@com_google_protobuf//:any_proto", "@com_google_protobuf//:duration_proto", "@com_google_protobuf//:empty_proto", "@com_google_protobuf//:field_mask_proto", "@com_google_protobuf//:timestamp_proto", "@go_googleapis//google/api:annotations_proto", "@go_googleapis//google/api:client", "@go_googleapis//google/api:field_behavior", "@go_googleapis//google/api:resource", ], )
验证逻辑
可以查看@go_googleapis//google/api/BUILD.bazel文件确认目标名称,例如:
client.proto对应的proto_library名称为clientfield_behavior.proto对应的proto_library名称为field_behaviorresource.proto对应的proto_library名称为resource
内容的提问来源于stack exchange,提问作者Senal Weerasinghe
相关产品推荐
相关产品推荐

