我有一个非常简单的gRPC服务,定义为:syntax = "proto3";package helloworld;import "annotations.proto";// The greeting service definition.service Greeter { // Sends a greeting rpc SayHello(HelloRequest) returns (HelloReply) { option (google.api.http) = { post: "/api/v1/hello" body: "*" } }}// The request message containing the user's name.message HelloRequest { string name = 1;}// The response message containing the greetingsmessage HelloReply { string message = 1;}有趣的方面是,我使用Envoy gRPC JSON转码过滤器在HTTP2 / Protobuf HTTP1 / JSON之间进行“翻译”。有关更多详细信息,请参见https://www.envoyproxy.io/docs/envoy/latest/api-v1/http_filters/grpc_json_transcoder_filter。此外,我正在使用Bazel构建基于Java的gRPC服务。 Envoy转码过滤器需要一些注释:option (google.api.http) = { post: "/api/v1/hello" body: "*"}我正在使用proto_library(https://github.com/cgrushko/proto_library)从.proto定义生成相应的.java文件,但是我无法添加import "google/api/annotations.proto";到.proto文件,因为我不知道如何将https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto导入到bazel项目中。谢谢。最好的祝福,j (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 丑陋,无法维护的超快速方式:向文件供应商通常,您可以将.proto复制到您自己的项目中并针对该项目进行构建。只要上游原型不会“太多”改变,它将继续工作。例如,如果googleapi调查正在使用其回购协议的用户,则如果您复制了文件,他们将找不到您的用法。将文件放入存储库后,您可以按照https://github.com/cgrushko/proto_library/blob/04369f0d2ade8c8566727e0b6f3a53f1ba8925c0/src/BUILD中的示例进行操作。可维护方式:外部存储库外部存储库(例如http_archive)使您可以依赖另一个Bazel项目。使用http_archive,它将作为构建的一部分进行下载和构建。使用http_archive,外部项目必须已经使用Bazel构建,而googleapi并非完全如此:它没有google/api/annotations.proto的BUILD文件。一种选择是与他们交谈,看看他们是否可以添加这样的BUILD文件(或自己发送PR)。另一种选择是使用new_http_archive并提供自己的BUILD文件作为定义的一部分。将以下内容添加到您的WORKSPACE文件(位于项目的根目录)应该或多或少地起作用:new_http_archive( name = "googleapi", url = "https://github.com/googleapis/googleapis/archive/common-protos-1_3_1.zip", strip_prefix = "googleapis-common-protos-1_3_1/", build_file_content = "proto_library(name = 'annotations_proto', srcs = ['google/api/annotations.proto'])")然后,您将可以依靠它来编写代码:proto_library( name = "hellow_world_proto", ... deps = ["@googleapi//:annotations_proto"],) (adsbygoogle = window.adsbygoogle || []).push({});
07-28 11:18