まくろぐ
更新:
作成:

.proto ファイルをインポートする (import)

Protocol Buffers の .proto 内で import ステートメントを使用すると、他の .proto ファイルの内容を取り込むことができます。 次の例では、main.proto から other.proto の内容をインポートして、OtherMessage というメッセージ型を参照しています。

proto/message/main.proto(インポートする側)
syntax = "proto3";

option go_package = "github.com/maku77/myapp/message";

import "message/other.proto";

message MainMessage {
  OtherMessage other = 1;
}
proto/message/other.proto(インポートされる側)
syntax = "proto3";

option go_package = "github.com/maku77/myapp/message";

message OtherMessage {
  string content = 1;
}

インポートのパスは、デフォルトでは protoc コマンドを実行したディレクトリからの相対パスで指定します。 起点となるディレクトリを変更したい場合は、protoc コマンドの --proto_path オプションで、.proto ファイルを配置したルートディレクトリを指定します。

.proto ファイルが proto ディレクトリ以下にある場合
$ protoc --go_out=. --go_opt=paths=source_relative --proto_path=proto message/main.proto

上記のように実行すると、proto/message/main.proto ファイル(およびそこからインポートされているファイル)を入力情報として、message/main.pb.go が生成されます。

インポートした内容を再公開する (import public)

別の .proto ファイルをインポートするときに、import public を使用すると、インポートした内容(メッセージ型の定義など)を自分自身が定義しているかのように公開することができます。 以下の例では、main.protoother1.proto しかインポートしていませんが、間接的に other2.proto で定義している Other2Message メッセージ型を参照しています。

main.proto
syntax = "proto3";

import "other1.proto";

message MainMessage {
  Other2Message other2 = 1;
}
other1.proto
syntax = "proto3";

import public "other2.proto";
other2.proto
syntax = "proto3";

message Other2Message {
  string content = 1;
}

関連記事

まくろぐ
サイトマップまくへのメッセージ