Protocol Buffers 导入消息取决于另一个导入的消息
Protocol Buffers import message depending on another imported message
关于 import 语句,google 表示 https://developers.google.com/protocol-buffers/docs/proto#services :
You can use definitions from other .proto files by importing them. To import another .proto's definitions, you add an import statement to the top of your file.
By default you can only use definitions from directly imported .proto files.
...听起来不错,但那又怎么样:
1.proto :
message M1{
required string foo = 1;
}
2.proto :
import "1.proto";
message M2{
required M1 m_1 = 1;
}
3.proto :
import "2.proto";
message M3{
required M2 m_2 = 1;
}
因此,在解析 3.proto 时,不应访问 M1,因为 1.proto 未从 2.proto 公开导入。
但是,M2 应该是,因为它是直接从 3.proto...
导入的
那么M2.m_1呢?编译器应该如何生成 类 ?
文档的意思是,如果你想在一个文件中引用M1
,你必须导入1.proto
,如果你想在一个文件中引用M2
,您必须导入 2.proto
。您不需要 显式导入implicit/transitive 依赖项。在不导入 1.proto
.
的情况下使用 M2
是完全没问题的
编译器实际上遵循传递导入并读取所有三个文件,以便为 3.proto
生成代码。此外,在 C++ 中,3.pb2.h
将 #include "2.pb2.h"
依次 #include "1.pb2.h"
。该规则只是一个语法规则。
为什么会有这个规定?好吧,考虑一下你是否可以直接在 3.proto
中使用 M1
而无需显式导入 1.proto
,只是因为你导入了 2.proto
而它本身会导入 1.proto
。现在考虑 2.proto
的维护者是否决定删除字段 m_1
。现在 2.proto
不使用 M1
,因此维护者决定删除 1.proto
的导入。但是现在 3.proto
坏了,因为它依赖于 2.proto
imported 1.proto
!
这是 C++ 包含的常见问题。我不想在 Protobufs 中遇到同样的问题,所以我制定了规则,您必须显式导入所有声明您在自己的文件中显式使用的类型的文件。
关于 import 语句,google 表示 https://developers.google.com/protocol-buffers/docs/proto#services :
You can use definitions from other .proto files by importing them. To import another .proto's definitions, you add an import statement to the top of your file. By default you can only use definitions from directly imported .proto files.
...听起来不错,但那又怎么样:
1.proto :
message M1{
required string foo = 1;
}
2.proto :
import "1.proto";
message M2{
required M1 m_1 = 1;
}
3.proto :
import "2.proto";
message M3{
required M2 m_2 = 1;
}
因此,在解析 3.proto 时,不应访问 M1,因为 1.proto 未从 2.proto 公开导入。 但是,M2 应该是,因为它是直接从 3.proto...
导入的那么M2.m_1呢?编译器应该如何生成 类 ?
文档的意思是,如果你想在一个文件中引用M1
,你必须导入1.proto
,如果你想在一个文件中引用M2
,您必须导入 2.proto
。您不需要 显式导入implicit/transitive 依赖项。在不导入 1.proto
.
M2
是完全没问题的
编译器实际上遵循传递导入并读取所有三个文件,以便为 3.proto
生成代码。此外,在 C++ 中,3.pb2.h
将 #include "2.pb2.h"
依次 #include "1.pb2.h"
。该规则只是一个语法规则。
为什么会有这个规定?好吧,考虑一下你是否可以直接在 3.proto
中使用 M1
而无需显式导入 1.proto
,只是因为你导入了 2.proto
而它本身会导入 1.proto
。现在考虑 2.proto
的维护者是否决定删除字段 m_1
。现在 2.proto
不使用 M1
,因此维护者决定删除 1.proto
的导入。但是现在 3.proto
坏了,因为它依赖于 2.proto
imported 1.proto
!
这是 C++ 包含的常见问题。我不想在 Protobufs 中遇到同样的问题,所以我制定了规则,您必须显式导入所有声明您在自己的文件中显式使用的类型的文件。