はじめに
前回記事に引き続き、今回もprotoファイルを分けた時の困りごとについてです。
例えば増えすぎたserviceを複数ファイルに分けて記述するようにしたときに、そのままそこからswaggerファイルを出力しようとするとprotoファイルの数だけswaggerファイルが出来上がってしまいます。
それは絶対にやだやだということで複数protoファイルからswaggerファイル1つにまとめて出力する方法を調べたところ日本語情報がなかったようだったので残しておきます。
実践
このようなディレクトリ構造だった場合について考えます。
.
└── pb
├── swagger
└── type
├── item.proto
├── shop.proto
└── user.proto
普通に下記のようなコマンドでprotoファイルからswaggerファイルを出力するとそれぞれのファイルが出力されてしまうと思います。
protoc -I<pb/typeのパス> -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --swagger_out=logtostderr=true:./pb/swagger ./pb/type/*.proto
出力ファイル
.
└── pb
├── swagger
│ ├── item.swagger.json
│ ├── shop.swagger.json
│ └── user.swagger.json
└── type
├── item.proto
├── shop.proto
└── user.proto
そこでprotoファイルを1ファイルにまとめるには先ほどのコマンドに allow-merge=true
オプションと merge_file_name=<出力ファイル名>
オプションを追加することで1つのswaggerファイルにまとめられます。
protoc -I<pb/typeのパス> -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --swagger_out=logtostderr=true,allow-merge=true,merge_file_name=api:./pb/swagger ./pb/type/*.proto
出力ファイル
.
└── pb
├── swagger
│ └── api.swagger.json
└── type
├── item.proto
├── shop.proto
└── user.proto