JUNのブログ

JUNのブログ

活動記録や技術メモ

protocで .proto ファイルから service に関するGoのコードが生成されない問題への対処方法

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 でも報告されている.

github.com

環境

  • libprotoc 3.12.3
  • protoc-gen-go v1.25.0-devel

原因

最初に原因を言ってしまうと protoc-gen-go のバージョンが原因でした.

以下の記事のおかげで解決したので貼っておきます.

qiita.com

で, 上記のサイトにも書いてあるのですが, 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-gogo 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関連のコードも含む全てのコードが想定どおり生成されました!!