2017-12-21 17 views
0

グーグル/ API/annotations.protoをインポートする方法:gRPC + Bazel +特使JSONプロキシ - として、私は非常に単純な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を使用しているということです<> HTTP2/Protobuf <> HTTP1/JSONの間でJSONトランスコードフィルタを「翻訳」します。詳細は、https://www.envoyproxy.io/docs/envoy/latest/api-v1/http_filters/grpc_json_transcoder_filterを参照してください。

また、JavaベースのgRPCサービスをビルドするためにBazelを使用しています。特使のトランスコーディングフィルタは、いくつかの注釈を必要とします。

option (google.api.http) = { 
    post: "/api/v1/hello" 
    body: "*" 
} 

私は.proto定義から対応する.javaファイルを生成するproto_library(https://github.com/cgrushko/proto_library)を使用していますが、私は

import "google/api/annotations.proto"; 
を追加することはできませんよ

を.protoファイルにインポートする方法については、https://github.com/googleapis/googleapis/blob/master/google/api/annotations.protoをbazelプロジェクトにインポートする方法がわかりません。

ありがとうございます。

よろしく、 JJ

+0

( 1)これを投稿していただきありがとうございます。問題を改善するために、エンボイの言葉のような無関係なものを削除する方が良いと思います。 (2)ファイルの先頭に 'google/api/annotations.proto'(' 'annotations.proto ''ではなく)をインポートすることを意味しましたか? – user1071136

答えて

1

醜い、unmaintainable超高速道:ベンダーあなたは通常、独自のプロジェクトに.protoをコピーし、それに対して構築することができます

ファイル。上流の原型が「あまりにも多く」変化しない限り、それは機能し続けるでしょう。

たとえば、のレポを使用しているアンケートでは、ファイルをコピーしても使用できません。

ファイルをレポに入れたら、https://github.com/cgrushko/proto_library/blob/04369f0d2ade8c8566727e0b6f3a53f1ba8925c0/src/BUILDの例に従うことができます。

、保守方法:外部リポジトリ

外部リポジトリ(例えばhttp_archive)を使用すると、別のBazelプロジェクトに依存することができます。 http_archiveを使用すると、ビルドの一部としてダウンロードされ、ビルドされます。 http_archive

、外部プロジェクトは、すでに正確googleapiの場合ではないですBazel、でビルドする必要があります。それはgoogle/api/annotations.protoのためのビルドファイルを持っていません。

1つのオプションは、それらと話をして、そのようなBUILDファイルを追加する(またはPRを自分で送信する)ことができるかどうかを確認することです。もう1つの選択肢は、new_http_archiveを使用し、定義の一部として独自のBUILDファイルを提供することです。

動作するはずです(プロジェクトのルートに)あなたのWORKSPACEファイルに以下の追加多かれ少なかれ:

proto_library(
    name = "hellow_world_proto", 
    ... 
    deps = ["@googleapi//:annotations_proto"], 
) 
:次に

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

、あなたはそれあなたのコードに依存することができるだろう

2

私は第2の提案(保守性方法:外部リポジトリを)続くとなってしまった:

WORKSPACE:

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

関連する問題