扩展导入的 .proto 文件中的 protobuf.FieldOptions

pep*_*er0 5 c++ protocol-buffers

我正在尝试在谷歌协议缓冲区中定义我的自定义字段选项。如果我创建这样的文件,一切正常:

import "google/protobuf/descriptor.proto";

package tutorial;

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}

message Persona {
  required string name = 1 [(myopt)=5];
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将“myopt”定义移动到另一个文件,编译将失败:

myext.proto:

package myext;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}
Run Code Online (Sandbox Code Playgroud)

地址簿.proto:

import "google/protobuf/descriptor.proto";
import "myext.proto";

package tutorial;


message Persona {
  required string name = 1 [(myopt)=5];
}
Run Code Online (Sandbox Code Playgroud)

汇编:

$ protoc --cpp_out=. -I/usr/include -I. addressbook.proto
addressbook.proto:8:29: Option "(myopt)" unknown.
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在其他文件中定义自定义字段选项而不是使用它的文件?如果我想在多个 .proto 文件中使用我的选项,将公共部分移动到公共文件非常重要。

Jed*_*ett 0

因为您已经使用新的原型文件创建了一个新包,所以您需要引用该包的命名空间。

正如您在评论中指出的,只需使用“(myext.myopt)”而不是“(myopt)”,所以它看起来像这样:

myext.proto:

未对您所展示的进行修改

package myext;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
  optional int32 myopt = 70000;
}
Run Code Online (Sandbox Code Playgroud)

地址簿.proto:

将“(myopt)”替换为“(myext.myopt)”

import "google/protobuf/descriptor.proto";
import "myext.proto";

package tutorial;


message Persona {
  required string name = 1 [(myext.myopt)=5];
}
Run Code Online (Sandbox Code Playgroud)