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

 ·   ·  ☕ 3 min read
.protocにgo_packageをつけてコードを生成すると"github.com/..."のようにフルパスで出力されますが、--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; }

protocprotoc-gen-goプラグインでGo向けのコードを生成します。

1
2
3
4
build-protobuf:
  protoc -I./grpc/ \ 
    --go_out=plugins=grpc:./grpc/ \ 
    ./grpc/*.proto

おっと、何やらWARNINGが出ています。 go_package オプションを付けろとのことです。付けなくても動きますが、WARNINGが出ているので対応すべきでしょう。

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.

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

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

1
2
3
4
syntax = "proto3";
option go_package = "github.com/ebiiim/greeter/grpc";
package greeter;
...
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オプションをつければ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