きみはねこみたいなにゃんにゃんなまほう

ねこもスクリプトをかくなり

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-xxxxprotoc で使うためにはパスを通してコマンドとして実行できるようにしておく必要があります。 なのでそのプラグインが使えている状態であれば、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

という、基本的なインタフェースとしては protocprotoc-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 で色々生成しているうちに妙に探すのが小慣れてきた感じがします。この方法の難点は、探し出したオプションが将来的に消えることはないのだろうか、と心配になるところですね。