2017-12-21 39 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을 사용하고 있다는 것입니다 <> JSON 트랜스 코딩 필터가 HTTP2/Protobuf <> HTTP1/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

못생긴, 이상 유지할 슈퍼 빠른 방법 : 벤더 당신은 일반적으로 자신의 프로젝트에 .proto를 복사하여에 구축 할 수 있습니다

파일; 업스트림 프로토 (proto)가 "너무 많이"바뀌지 않는 한 작업을 계속할 것입니다.

예를 들어의 리포를 사용하는 설문 조사에서 파일을 복사하면 사용량을 찾을 수 없습니다.

리포에 파일이 있으면 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 파일에 다음과 같은 추가 더 많거나 적은 :

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

나는 두 번째 제안합니다 (유지 보수 방법 : 외부 저장소를) 다음과 함께 결국 :

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