2016-08-02 5 views
4

다른 구조체에 대한 참조를 포함하는 golang 구조체가 있습니다. 구조체에서 .proto 파일을 생성하는 자동화 된 방법이 있습니까? 예를 들어golang 구조체에서 proto 파일 생성

:

type A struct { 
a int 
b B 
} 

type B struct { 
c []C 
} 

type C struct { 
x int 
} 

생성해야

message A, B, C 등 proto3 바람직하다.

https://github.com/kubernetes/kubernetes/tree/master/cmd/libs/go2idl은 관련이 있지만 문서화되지 않았습니다. 어떤 옵션이 있니? proteus (https://github.com/src-d/proteus)

테우스/proʊtiəs/생성하는 도구입니다 프로토콜이 이동 구조체, 유형에서 버전 3 개 호환 .proto 파일을 버퍼링 : 난

+0

이 소리는 농담입니다. 일반적으로 proto에서 생성 된 이동하고 그것을 거꾸로 할 유용한 사례를 상상할 수 없다.이런 원시적 인 경우에는 * .proto를 직접 쓰는 것이 문제가되지 않습니다. 더 복잡한 경우 (enums, oneof, ...) 모든 도구는 쓸모가 없습니다. – lofcek

답변

3

는 이동 소스 코드에서 파일을 패키지를 찾을 수 .proto 생성 기능.

이 라이브러리의 목적은 Go를 모델의 진실의 근원지로 사용하고 그 대신에 관용구 코드를 생성하지 않는 .proto 파일에서 Go 코드를 생성하는 것입니다.

는 protobuf 메시지

//proteus:generate 
    type User struct { 
     Model 
     Username string 
    } 

    type Model struct { 
     ID int 
     CreatedAt time.Time 
    } 

이 예는 다음 protobuf 메시지를 생성합니다를 생성합니다.

message User { 
      int32 id = 1; 
      google.protobuf.Timestamp created_at = 2; 
      string username = 3; 
    } 

go get -v gopkg.in/src-d/proteus.v1/... 

요구 사항

전체 과정에 대한 두 가지 요구 사항이 있습니다를 설치합니다.

protoc binary installed on your path 
go get -u github.com/gogo/protobuf/... 

사용

당신은 프로토 파일을 생성 할 수 있습니다

, 정렬 화/비 정렬 화 및 이동 유형에 대한 protobuf 물건의 나머지 RPC 클라이언트 및 서버 인터페이스와 패키지의 RPC 서버 구현 . 즉, 전체 과정입니다.

proteus -f /path/to/protos/folder \ 
    -p my/go/package \ 
    -p my/other/go/package 

만 테우스와 함께 제공되는 명령 줄 도구를 사용하여 프로토 파일을 생성 할 수 있습니다.

proteus proto -f /path/to/output/folder \ 
    -p my/go/package \ 
    -p my/other/go/package 
    --verbose 

또한 만 패키지 gRPC 서버 구현을 생성 할 수 있습니다.

proteus rpc -p my/go/package \ 
    -p my/other/go/package 

참고 : 테우스는 플러그인을 통해 확장 될 때까지 기본값, 사용자의 요구에 적합하지 않은 경우 물론, 당신이 제공하는 구성 요소를 사용하여 함께 자신의 발전기 명령을 해킹 할 수 있습니다. 패키지의 godoc 문서를 확인하십시오.

+0

투표가 중단되거나 플래그가 표시되지 않도록하려면 단순한 링크 이상의 것을 추가해야합니다. 필수 정보를 입력하면 링크가 끊어진 경우에도 대답은 유효합니다. – Jonathan

+1

죄송합니다. 답변을 작성한 것은 이번이 처음입니다. 나중에주의 할 것입니다 –

+0

편집 작업이 아주 좋습니다! 불행히도, 나는 Go가 잘 모르겠다 고 생각하기 때문에이 질문에 실제로 대답 할 수 있는지 모르겠지만, 잘하면 down-vote 한 사람은 당신의 업데이트를보고 retract/upvote를 볼 것입니다. – Jonathan