protoc-gen-xxxx のオプションを確認する方法を探す
protoc
を使いサーバ/クライアント実装の組み合わせや変換プロキシなどのエコシステムを色々と検証しているのですが、そのせいもあって手元にある分だけでも 7 つ程の protoc-gen-xxxx
プラグインがインストールされています。
$ protoc-gen- protoc-gen-dart protoc-gen-grpc-gateway protoc-gen-ts protoc-gen-go protoc-gen-grpc-web protoc-gen-govalidators protoc-gen-swagger
これらがあることで
protoc -I. \ --grpc-gateway_out=logtostderr=true:. \ my.proto
のようにデフォルトではサポートされていない --xxxx_out
オプションを使いコードを生成することができるのですが、そのオプションで実行される protoc-gen-xxxx
の更にそのオプションである --xxxx_out="<plugin-options>:out"
の種類がプラグインごとに様々だったり、確認方法が提供されているかもまちまちだったりするのでちょっと整理してみたいです。
protoc-gen-xxxx はコマンドとして実行できる
まず基本的なところの確認です。
protoc-gen-xxxx
を protoc
で使うためにはパスを通してコマンドとして実行できるようにしておく必要があります。
なのでそのプラグインが使えている状態であれば、protoc-gen-xxxx
は単体のコマンドとしても実行できます。
標準入力を受け取り動作するようなので適当に dummy-contents
と入力して Ctrl+d
で EOF を送ると「proto
として読めないよ」という旨のようなエラーが返されます。
$ protoc-gen-grpc-gateway dummy-contents F0922 13:33:41.840980 97540 main.go:45] failed to unmarshal code generator request: proto: can't skip unknown wire type 4
という、基本的なインタフェースとしては protoc
と protoc-gen-xxxx
は標準入出力を介して繋がっているだけなので、割とシンプルで分かりやすいです。
コマンドライン引数でオプションを渡してヘルプを見る
--xxxx_out="<plugin-options>:out"
として protoc
に渡しているオプションはコマンドラインからプラグインを実行する際にはコマンドライン引数として渡すことができるようです。
protoc-gen-grpc-gateway で試してみると以下のようにヘルプが表示されます。
$ protoc-gen-grpc-gateway -h Usage of protoc-gen-grpc-gateway: -allow_delete_body unless set, HTTP DELETE methods may not have a body -allow_repeated_fields_in_body body allows to use repeated field in body and `response_body` field of `google.api.http` annotation option : -logtostderr log to standard error instead of files : -v value log level for V logs
この -h
でヘルプが見られるのは protoc-gen-grpc-gateway がコマンドラインオプションの実装に flag というパッケージを使っているからです。
ついでに golang/glog というロギングパッケージのオプションも同様に flag で実装され、そのオプションも protoc-gen-grpc-gateway のオプションとして露出しているようなので、ログを標準入力に出す -logtostderr
や粒度を設定する -v
(verbose) オプションも利用できます。こういうオプションが備わっているプラグインだとデバッグなんかも楽になりますね。
と言ってもこの方法が使えるのは手元のプラグインの中で言えば protoc-gen-grpc-gateway 系だけみたいです。
--grpc-gateway_out=logtostderr=true,v=1:out
のように verbose レベルを指定できます。
諦めてコードを読む
オプションにヘルプが用意されているプラグインはいいですが、大部分のプラグインには用意されていないようなのでその場合はドキュメンテーション頼りか、コードを読んで対応する場合が多いです。自分が知らないだけでプラグインのオプションを確認する方法があるのかもしれませんが...
大抵 GitHub のリポジトリで option
や存在することが分かっているオプション名などのキーワードで検索すれば引っかかってきます。例えば protoc-gen-go の場合は ここ に見つかりました。
この辺は protoc
で色々生成しているうちに妙に探すのが小慣れてきた感じがします。この方法の難点は、探し出したオプションが将来的に消えることはないのだろうか、と心配になるところですね。