.proto を整形する

.proto ってどうやって整形するんだろう?って思ったら Issue がヒット。

proto file formatter · Issue #4113 · google/protobuf

clang-format を使えってことみたいなので、やってみる。


Mac なら brew で入る。

$ brew install clang-format
$ clang-format -i hoge.proto

JetBrains 系エディタなら clang-format プラグインがあって Reformat Code with clang-format というコマンドが増えるので、これを実行すると OK
内部的に clang-format を実行するので、実行できる状態になっている必要がある。

vscode にも同様の動きをするような Clang-Format という拡張機能があるのでこれを使うと整形が出来る。
と思ったが .proto には紐付いてないみたいなのでダメっぽい…?

--

とはいえ環境を汚したくないとか、何かしらの都合で入れられないとかあると思うので
Docker 使って make なりのタスクランナーから実行出来るようにしてあげるのがいいかな。

Dockerfile はこんな様子で。

FROM alpine:3.8

RUN apk add clang findutils

ENTRYPOINT find . -type f | xargs clang-format -i

run はこんなふうにやる。

$ docker run --rm -t -w /work -v "$(pwd)":/work clang-format

というのを試したリポジトリはココ。

sters/docker-clang-format-example: testrepo

ガタガタな proto も整えてくれる。

Before

syntax = "proto3";

package example;

import "google/protobuf/timestamp.proto";




service Example {
    rpc Get(GetRequest) returns (GetResponse) {};
}

message GetRequest {
    string fieldA;
            int fieldB;
google.protobuf.Timestamp fieldC;
}

message GetRequest {
string a;
    repeated google.protobuf.Timestamp b;
}

After

syntax = "proto3";

package example;

import "google/protobuf/timestamp.proto";

service Example {
  rpc Get(GetRequest) returns (GetResponse) {};
}

message GetRequest {
  string fieldA;
  int fieldB;
  google.protobuf.Timestamp fieldC;
}

message GetRequest {
  string a;
  repeated google.protobuf.Timestamp b;
}

前後の記事

Next:
Prev: