Todo
Todo | Done |
---|---|
protobuf で go mod vendor 使えばいいんじゃないか?を見てみる |
Log
protobuf で go mod vendor 使えばいいんじゃないか?を見てみる
何も考えずに $GOROOT/src
をインクルードパスに指定してたけど、どのバージョンに依存してるかよくわからない状態だったので Go Module
使って管理したほうが良さそう。
そして go mod vendor
を使えば、インクルードパスも vendor
にできるんじゃないか、ということでやってみる。
まず import を github.com から書くのをやめる。 外部の import が github.com から指定だったから揃えてみたけど結果的に全然良くなかった。
ここみるのが良さそう。
https://github.com/grpc-ecosystem/grpc-gateway
protoc のプラグインを go.mod
に追加するために tools/dependencies.go
を作る。
package main
import (
_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway"
_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2"
_ "github.com/mwitkow/go-proto-validators"
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
)
go mod init && go mod tidy
をすると、go.mod
go.sum
ができる。
そして go mod vendor
を実行すると、必要なファイルが vendor 配下に落ちてくる。
grpc-gateway
の README によると、以下の import を proto ファイルに追加するらしいが
import "google/api/annotations.proto";
何度やってもこうなる。
Import "googleapis/google/api/annotations.proto" was not found or had errors.
インクルードパスにないからね、そりゃそうだよねって思ってたら、ちゃんと書いてあった。
You will need to provide the required third party protobuf files to the protoc compiler. They are included in this repo under the third_party/googleapis folder, and we recommend copying them into your protoc generation file structure. If you’ve structured your proto files according to something like the Buf style guide, you could copy the files into a top-level ./google folder.
英語パッと読めないから気づくまで時間かかってしまったよ。。
現在 protobuf リポジトリは以下のような構造になっているので、proto
配下にコピーする。
repo
├── proto
│ ├── google <- ここに置く
│ ├── pkgA
│ │ ├── a_service1.proto
│ │ └── a_service2.proto
│ ├── pkgB
│ │ ├── b_service1.proto
│ │ └── b_service2.proto
│ └── pkgC
│ ├── c_service1.proto
│ └── c_service2.proto
└── go/
└── <生成されるファイル>
ので vendorからコピーしようとしたら vendor 配下の grpc-gateway に third_party ディレクトリがない・・・
https://github.com/golang/go/issues/26366
vendor では全てのファイルをとってくるわけではないそう。
上記Issueもまだ結論出ておらず、とりあえず全コピーするコマンド vend を作ってくれたそうなのでこれを使う。
https://github.com/nomad-software/vend
vend
cp -R vendor/github.com/grpc-ecosystem/grpc-gateway/v2/third_party/googleapis/google proto
これで一旦通せるようになったので、vendor を構築するコマンド達を Makefile にまとめておく。
prepare::
go get github.com/nomad-software/vend
vend
cp -R vendor/github.com/grpc-ecosystem/grpc-gateway/v2/third_party/googleapis/google proto
が、openapiv2 を吐き出してるところでエラー。
protoc-gen-openapiv2 の annotation を使ってたんだけど、この行で import が protoc-gen-openapiv2 から指定になってる。
この場合は、上の googleapis と同様コピーするか、github.com/grpc-ecosystem/grpc-gateway
をインクルードパスに追加するしかないことになる。
そろそろ眠いのでここは一旦要検討。
その他作業中に発生したこと
Next
- openapiv2 の問題解決