概要
gRPCで通信しようとすると.proto
ファイルが沢山出てきます。
ただ人によってインデントが異なったりするのは良くないので、何かしらformatterが無いかなと探したら
こちらのissueで「Googleではclang-format
を使ってるよ」という回答があったのでそれを使ってみます。
環境
- macOS Mojave 10.14.2
- clang-format 8.0.0
設定
インストール
brew でインストールできます。
$ brew install clang-format
使い方
$ xargs clang-format -i foo.proto
で整形できます。ディレクトリ丸ごと実行したい場合は./proto/
ディレクトリで定義しているとすると
$ find ./proto/ -name "*.proto" | xargs clang-format -i
で整形できます。
ただしデフォルトだと1フィールドだけのmessageが1行にまとまってしまったりと微妙なので、次の設定で調整していきます。
設定
clang-formatは自動で言語を判定して、それに合った整形をしてくれますが期待しない結果のときもあります。
その時は.clang-format
というファイルを実行箇所に用意して細かく設定していきます。
BasedOnStyle
あらかじめ
といったメジャーどころのプロジェクトのスタイルが定義されています。
ref: Clang-Format Style Options — Clang 10 documentation
protocol buffersはGoogleが開発しているので、
BasedOnStyle: Google
を使うと良いです。
AlignConsecutiveAssignments
AlignConsecutiveAssignments
は=
の位置を揃えてくれます。
before
int64 aaaa = 1; int64 b = 2; int64 ccc = 3;
after
int64 aaaa = 1; int64 b = 2; int64 ccc = 3;
AlignConsecutiveDeclarations
AlignConsecutiveDeclarations
は型定義の部分を揃えてくれます。
before
string aaaa = 1; int64 b = 2; bool ccc = 3;
after
string aaaa = 1; int64 b = 2; bool ccc = 3;
ただしrepeated
やproto2のoptional
が入ると期待しない結果になることもあります。
※追記:↑のrepeated
問題はclang-format 9.0.0で直っていました
ColumnLimit
ColumnLimit
は行の長さの上限値です。0
に設定した場合は上限なしで改行されなくなります。
まとめると
最終的には以下のような.clang-format
ファイルを用意するといい感じに整形してくれます。
--- Language: Proto BasedOnStyle: Google AlignConsecutiveAssignments: true AlignConsecutiveDeclarations: true
まとめ
protobufを使う場合は是非clang-format
の導入をオススメします。