Language Guide (proto3) | proto3 语言指南(五)使用其他消息类型
Using Other Message Types - 使用其他消息类型
可以将其他消息类型用作字段类型。例如,假设您希望在每个SearchResponse
消息中包含Result
消息——为此,您可以在同一.proto
中定义Result
消息类型,然后在SearchResponse
中指定类型为Result
的字段:
message SearchResponse {
repeated Result results = 1;
}
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
导入定义
请注意,此功能在Java中不可用。
在上面的示例中,Result
消息类型与SearchResponse
在同一个文件中定义——如果要用作字段类型的消息类型已经在另一个.proto
文件中定义了呢?
通过导入其他.proto
文件,可以使用这些文件中的定义。要导入另一个.proto
的定义,请在文件顶部添加一个import
语句:
import "myproject/other_protos.proto";
默认情况下,只能使用直接导入的.proto
文件中的定义。但是,有时可能需要将.proto
文件移动到新位置。不用直接移动.proto
文件并在一次更改中更新所有import
调用,现在可以在旧位置放置一个伪.proto
文件,使用import public
概念将所有导入转发到新位置。任何导入包含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
协议编译器使用-I/--proto_path
路径标志在协议编译器命令行上指定的一组目录中搜索导入的文件。如果没有给定标志,它将在调用编译器的目录中查找。通常,您应该将--proto_path
标志设置为项目的根目录,并对所有导入使用完全限定名。
使用proto2
消息类型
可以导入proto2
消息类型并在proto3
消息中使用它们,反之亦然。但是,proto2
枚举不能在proto3
语法中直接使用(如果导入的proto2
消息可以使用他们)。