Daily/2021/01/20

2021-01-20

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 から指定になってる。

https://github.com/grpc-ecosystem/grpc-gateway/blob/master/protoc-gen-openapiv2/options/annotations.proto#L8

この場合は、上の googleapis と同様コピーするか、github.com/grpc-ecosystem/grpc-gateway をインクルードパスに追加するしかないことになる。

そろそろ眠いのでここは一旦要検討。

その他作業中に発生したこと

Next

  • openapiv2 の問題解決
logs

Satoshi Koizumi

Daily/2021/01/24

Daily/2021/01/19