JavaScriptを有効にしてください

Go Modules環境でProtobufのgo_packageオプションを使う(gRPC)

 ·   ·  ☕ 3 min read

GoでgRPCのコードを書くとき、.protocにgo_packageを書いた場合、protocが"github.com/..."のようにフルパスでコードを出力します(たぶん意図した動作ではない)。これはprotocの--go_optオプションで回避できます。

protoc-gen-goでgo_packageに関するWARNINGが出る

gRPCのUnary RPCでHelloするプログラムがあるとします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
~/greeter/
├── Makefile
├── client
│   └── main.go
├── server
│   └── main.go
├── grpc
│   └── greeter.proto
├── go.mod
└── go.sum

Protobuf(greeter.proto)は次のように定義されています。

1
2
3
4
5
6
7
syntax = "proto3";
package greeter;
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }

これでGo向けのコードを生成すると、go_packageに関するWARNINGが出ます。

1
2
3
4
build-protobuf:
  protoc -I./grpc/ \ 
    --go_out=plugins=grpc:./grpc/ \ 
    ./grpc/*.proto
1
2
3
4
2020/06/24 15:56:34 WARNING: Missing 'go_package' option in "greeter.proto",
please specify it with the full Go package path as
a future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.

go_package オプションを付けろとのことです。付けなくても動きますが、つけておくべきでしょう。しかし、つけると出力のパスがおかしくなります…。

option go_packageをつけると出力先がおかしい

2行目のようにoption go_packageを付けて、もう一度Goのコードを生成します。

1
2
3
4
syntax = "proto3";
option go_package = "github.com/ebiiim/greeter/grpc";
package greeter;
...

protocを実行すると、Goのコードが次のディレクトリ構成で出力されます。

1
2
3
4
5
6
7
├── grpc
│   ├── github.com
│   │   └── ebiiim
│   │       └── greeter
│   │           └── grpc
│   │               └── greeter.pb.go
│   └── greeter.proto

違う、そうじゃない

これだとimport文がimport "github.com/ebiiim/greeter/grpc/github.com/ebiiim/greeter/grpc"になりますが、やりたいのはimport "github.com/ebiiim/greeter/grpc"です。

つまり、次のように出力してほしいのです。

1
2
3
├── grpc
│   ├── greeter.pb.go
│   └── greeter.proto

これにはprotocに--go_optオプションをつける必要があります。

解決法: protocに–go_optオプションをつける

次のように、protoc--go_optオプションをつければOKです。

1
2
3
4
5
build-protobuf:
  protoc -I./grpc/ \ 
    --go_out=plugins=grpc:. \ 
    --go_opt=module=github.com/ebiiim/greeter \ 
    ./grpc/*.proto

本記事のソースコード https://github.com/ebiiim/greeter