Help us understand the problem. What is going on with this article?

Protocol Buffers用 Go言語APIの APIv1 と APIv2 の差異

この記事について

Protocol Buffers用 Go言語API に新しく V2 (APIv2) が出たことにより、import のパス、リポジトリ、protoc-gen-go などに違いがあり混乱したので整理してみた。

なお、投稿時(2020/05/11)での情報なので今後変わる可能性あり。

Protocol Buffers用 Go言語API について

Protocol Buffers(以下、protobuf)は言語ニュートラルなデータのシリアライズの仕組みで、Go言語でも protobuf を使うための API が提供されている。

最初の API が提供されたのが 2010年ごろで、これを APIv1 と呼ぶ。
そして、2020年3月に新しい APIv2 がリリースされた。

APIv2 についてのごく簡単な特徴:

  • *.proto ファイルで定義された protobuf のアノテーションを Go から読めるようにした
  • APIv2 は後方互換性はない
    • APIv1 は今後もずっとサポートを継続する(原文: We intend to maintain support for APIv1 indefinitely.)

APIv1 と APIv2 の違い

APIv1

  • 最新バージョンは v1.4 系
    • v1.4.0 から内部的には APIv2 を使って実装されている
  • APIv1 の import パス等は以下を参照
対象
import のパス github.com/golang/protobuf
ソースのリポジトリ https://github.com/golang/protobuf
protoc-gen-go github.com/golang/protobuf/protoc-gen-go

APIv2

  • バージョンは v1.20.0 から始まる
    • APIv1 のバージョンが 1.20 まで進まないだろうという予想とのこと
  • APIv2 の import パス等は以下を参照
対象
import のパス google.golang.org/protobuf
ソースのリポジトリ https://github.com/protocolbuffers/protobuf-go
protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go

protoc-gen-go と gRPC のスタブ生成について

APIv2 の protoc-gen-go は gRPC で使うスタブコードを生成しなくなった。代わりに protoc-gen-go-grpc というプラグインが提供される予定とのことだが、まだ提供されてない模様。
APIv1 の protoc-gen-go は gRPC のサポートを継続するので、しばらくはそちらを使うということらしい。

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.

ちなみに APIv2 の protoc-gen-go で gRPC のスタブを生成しようとすると、以下のように怒られた。

$ go get google.golang.org/protobuf/cmd/protoc-gen-go

$ protoc-gen-go --version
protoc-gen-go v1.22.0-devel

$ protoc helloworld.proto --go_out=plugins=grpc:.
--go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC

$ protoc helloworld.proto --go-grpc_out=.
protoc-gen-go-grpc: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
--go-grpc_out: protoc-gen-go-grpc: Plugin failed with status code 1.

参考

kitauji
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away