Carpe Diem

備忘録

.proto ファイルの整形に clang-format を使う

概要

gRPCで通信しようとすると.protoファイルが沢山出てきます。
ただ人によってインデントが異なったりするのは良くないので、何かしらformatterが無いかなと探したら

github.com

こちらの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の導入をオススメします。

ソース