Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gRPC&x2B;巴泽尔+;特使Json代理-如何导入google/api/annotations.proto_Java_Json_Protocol Buffers_Grpc_Bazel - Fatal编程技术网

Java gRPC&x2B;巴泽尔+;特使Json代理-如何导入google/api/annotations.proto

Java gRPC&x2B;巴泽尔+;特使Json代理-如何导入google/api/annotations.proto,java,json,protocol-buffers,grpc,bazel,Java,Json,Protocol Buffers,Grpc,Bazel,我有一个非常简单的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) = {

我有一个非常简单的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;
}
有趣的是,我正在使用特使gRPC JSON转码过滤器在HTTP2/Protobuf HTTP1/JSON之间进行“转换”。有关更多详细信息,请参阅

此外,我正在使用Bazel构建基于Java的gRPC服务。特使转码过滤器需要一些注释:

option (google.api.http) = {
  post: "/api/v1/hello"
  body: "*"
}
我正在使用proto_库()从.proto定义生成相应的.java文件,但无法添加

import "google/api/annotations.proto";
到.proto文件,因为我不知道如何导入到bazel项目

多谢各位

致以最良好的祝愿, jj

丑陋、无法维护的超快速方式:出售文件 您通常可以将
.proto
复制到您自己的项目中,并根据它进行构建;只要上游proto没有“太多”改变,它就会继续工作

例如,如果
googleapi
调查谁在使用他们的回购协议,如果你复制了文件,他们将找不到你的使用情况

一旦您的回购协议中有了该文件,您就可以按照中的示例进行操作

可维护的方式:外部存储库 外部存储库(例如)允许您依赖另一个Bazel项目。使用http_archive,它将被下载并作为构建的一部分构建

使用
http\u archive
,外部项目必须已经使用Bazel构建,这与
googleapi
的情况不完全相同:它没有用于
google/api/annotations.proto的构建文件

一个选择是与他们交谈,看看他们是否可以添加这样的构建文件(或者自己发送PR)。另一个选项是使用并提供自己的构建文件作为定义的一部分

将以下内容添加到
工作区
文件(在项目的根目录下)应该或多或少有效:

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"],
)

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

工作空间:

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'])
建造

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

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

(1)感谢您发布此消息。为了改进这个问题,我认为最好去掉不相关的东西,比如提到特使。(2) 你是想在你的文件顶部导入
google/api/annotations.proto
(而不是
“annotations.proto”
)吗?我在bazel(0.25.3)中尝试了你的解决方案,出现以下错误:C:/users/cen/_bazel\u cen/rmmz4bjv/external/googleapi/BUILD.bazel:7:10:Label'@googleapi//:google/api/annotations.proto'跨越子包的边界'@googleapi//google/api'(也许你的意思是把冒号放在这里:'@googleapi//google/api:annotations.proto'))最新的googleapis代码确实有BUILD.bazel文件。我尝试使用git_存储库来引用它。git_repository(name=“googleapis”,remote=“”,commit=“3AEB3A70F66457A9E6B07CAFF84719BB9873B57”),我试图将annotations.proto作为depdency proto_库引用(name=“product_proto”,srcs=[“product.proto”],deps=[“@googleapis//googleapis/google/api:annotations_proto”]),我得到了这个错误,没有这样的包“@googleapis//googleapis/google/api”:在外部存储库@googleapis的目录“googleapis/google/api”中找不到构建文件