gRPC触ろうと思って.protoファイルから protoc
をGoのコード使って生成したら service に関するコードが一切ないし, plugins オプションを指定するとエラーが出るしで2時間くらい詰まったのでここに解決方法をメモしておく.
エラー
$ protoc -I proto --go_out=plugins=grpc:. proto/control.proto --go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC
エラーが出た.
$ protoc -I proto --go_out=pb/ proto/control.proto
これだとエラーは出ないけど, 生成されたコードに service に関するコードが無い.
同じ現象はいくつかの issue でも報告されている.
環境
- libprotoc 3.12.3
- protoc-gen-go v1.25.0-devel
原因
最初に原因を言ってしまうと protoc-gen-go
のバージョンが原因でした.
以下の記事のおかげで解決したので貼っておきます.
で, 上記のサイトにも書いてあるのですが, protocolbuf-go のリリースノート に以下のようなことが書いてありました.
gRPC support The v1.20 protoc-gen-go does not support generating gRPC service definitions. In the future, gRPC service generation will be supported by a new protoc-gen-go-grpc plugin provided by the Go gRPC project.
The github.com/golang/protobuf version of protoc-gen-go continues to support gRPC and will continue to do so for the foreseeable future.
つまり, 「v1.20(以降)の protoc-gen-go は gRPC サービス定義のコード生成をサポートしてないよ(現時点では). でも, 将来的には新しいプラグインによりサポートするよ. github.com/golang/protobuf バージョンは引き続き gRPCのサポートするよ.」的なことらしい.
自分は protoc-gen-go
を go install google.golang.org/protobuf/cmd/protoc-gen-go
という風にインストールしてしまったのですが, これでは APIv2 の protoc-gen-go
を使ってしまうので service に関するコードが生成されませんでした.
なので, 解決方法としては APIv1 の protoc-gen-go
を入れれば解決しました.
# APIv2のprotoc-gen-goを削除 go clean google.golang.org/protobuf # APIv1のprotoc-gen-goをインストール go get github.com/golang/protobuf/protoc-gen-go
APIv1 の protoc-gen-go を入れ直した後コマンドを実行すると無事service関連のコードも含む全てのコードが想定どおり生成されました!!