【问题标题】:gRPC + Bazel + Envoy Json Proxy - How to import google/api/annotations.protogRPC + Bazel + Envoy Json 代理 - 如何导入 google/api/annotations.proto
【发布时间】:2018-06-04 11:39:30
【问题描述】:

我有一个非常简单的 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 greetings
message 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 项目。

谢谢。

最好的问候, jj

【问题讨论】:

  • (1) 感谢您发布此信息。为了改进这个问题,我认为最好删除不相关的东西,比如提到 Envoy。 (2) 您的意思是在文件顶部导入google/api/annotations.proto(而不是"annotations.proto")?

标签: java json protocol-buffers grpc bazel


【解决方案1】:

我遵循了第二个建议(可维护的方式:外部存储库)并最终得到:

工作空间:

http_archive(
name = "com_google_protobuf",
sha256 = "cef7f1b5a7c5fba672bec2a319246e8feba471f04dcebfe362d55930ee7c1c30",
strip_prefix = "protobuf-3.5.0",
urls = ["https://github.com/google/protobuf/archive/v3.5.0.zip"],
)

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="BUILD.googleapi"
)

BUILD.googleapi

package(default_visibility=['//visibility:public'])

proto_library(
name = 'annotations_proto',
srcs = ['google/api/annotations.proto'],
deps = [
        ":http_proto",
        "@com_google_protobuf//:descriptor_proto"
    ],
)

proto_library(
name = 'http_proto',
srcs = ['google/api/http.proto'])

构建

最后是 BUILD 文件中对 annotation.proto 的引用:

proto_library(
name = "GreeterServices_proto",
srcs = ["GreeterServices.proto"],
deps = [
    "@googleapi//:annotations_proto",
])

问候, jj

【讨论】:

  • 我在 bazel(0.25.3) 中尝试了您的解决方案,出现以下错误:C:/users/cen/_bazel_cen/rmmz4bjv/external/googleapi/BUILD.bazel:7:10: Label ' @googleapi//:google/api/annotations.proto' 跨越了子包 '@googleapi//google/api' 的边界(也许你的意思是把冒号放在这里:'@googleapi//google/api:annotations.proto'? )
【解决方案2】:

丑陋的、不可维护的超快速方式:vendor the file

您通常可以将.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"],
)

【讨论】:

  • 最新的googleapis代码确实有BUILD.bazel文件。我尝试使用 git_repository 来引用它。 git_repository( name = "googleapis", remote = "github.com/googleapis/googleapis.git", commit = "3aeb3a70f66457a9e6b07caff841719bb9873b57", ) 我试图将 annotations.proto 称为依赖 proto_library( name = "product_proto", srcs = ["product.proto" ], deps = [ "@googleapis//googleapis/google/api:annotations_proto" ], )
  • 我得到这个错误,没有这样的包'@googleapis//googleapis/google/api':在外部存储库@googleapis的目录'googleapis/google/api'中找不到BUILD文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多