使用其它消息类型
可以使用其它消息类型作为字段类型。例如, 假设你想在每个SearchResponse消息中包含Result消息,可以在相同的.proto文件中定义Result消息类型然后SearchResponse中的一个字段指定为Result类型:
message SearchResponse {
repeated Result result = 1;
}
message Result {
required string url = 1;
optional string title = 2;
repeated string snippets = 3;
}
导入定义
上面的例子中, Result消息类型和SearchResponse定义在同一个文件中,如果你想要使用的一个已经定义其它的.proto文件消息类型呢?
这时可以通过导入.proto文件来使用来它定义的类型,需要在文件的顶端增加导入声明:
import "myproject/other_protos.proto";
默认只能从直接导入的.proto文件中使用其中的定义,然后,有时候可能需要移动.proto文件到一个新的位置。相比直接移动.proto文件并更新所有的调用点, 现在可以有其它的方法: 在原有位置放置一个伪装的.proto文件, 通过使用import public方式转发所有的import到新的位置. 其它任何导入这个包含import public语句的proto文件都可以透明的得到通过import public方法导入的依赖. 例如:
// new.proto
// All definitions are moved here
// old.proto
// This is the proto that all clients are importing.
import public "new.proto";
import "other.proto";
// client.proto
import "old.proto";
// You use definitions from old.proto and new.proto, but not other.proto
protocol编译器在通过命令行-I/--proto_path参数指定的目录集合中搜索导入的文件. 如果没有指定参数, 则在编译器被调用的目录下查找. 通常应该设置--proto_path参数到项目所在的根目录然后为所有的导入使用完整限定名。
proto2
导入proto3消息类型可以在proto2消息中使用,反之亦然。但是,proto2枚举不能在proto3语法中使用。