2016-08-02 20 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は関連性があるようですが、文書化されていません。オプションは?

+0

この音は冗談のようです。通常protoから生成され、私はそれを逆さまにする有用なケースを想像することはできません。このような原始的なケースでは、* .protoを直接書くのは問題ではありません。もっと複雑なケース(enum、oneof、...)では、すべてのツールは役に立たない。 – lofcek

答えて

3

私は、パッケージを探しに行くのソースコードからファイル.proto生成: proteus (https://github.com/src-d/proteus)

プロテウス/proʊtiəs/あなたの移動の構造体からのプロトコル・バッファーバージョン3つの互換性の.protoファイルを生成するツールである、種類と機能。

このライブラリの背景には、あなたのモデルの真実の源としてGoを使用し、慣用コードを生成しない.protoファイルからGoコードを生成するというものがあります。

この例では、次のよういるProtobufメッセージが生成されますいるProtobufメッセージ

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

    type Model struct { 
     ID int 
     CreatedAt time.Time 
    } 

を生成します。

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

完全なプロセスのための2つの要件があります。

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

要件

をインストールします。

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

使用

あなたは、あなたの移動タイプに対してRPCクライアントとサーバのインタフェースや、あなたのパッケージのためのRPCサーバの実装をプロト・ファイル、マーシャル/アンマーシャリングといるProtobufものの残りの部分を生成することができます。つまり、プロセス全体です。

protoファイルは、proteusで提供されるコマンドラインツールを使用してのみ生成できます。

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を知らないので、これが実際に質問に答えるかどうかは分かりませんが、うまくいけば誰でもあなたの更新を見て、それが収まるならupvoteを取り戻すでしょう。 – Jonathan