【问题标题】:How to include .proto files having mutual dependency如何包含具有相互依赖关系的 .proto 文件
【发布时间】:2017-07-28 17:02:49
【问题描述】:

我有两个 .proto 文件,其中有两个相互依赖的包。

a.proto

syntax = "proto3";
import "b.proto";

package a;

message cert {
    string filename = 1;
    uint32 length = 2;
}

enum state {
    UP = 1;
    DOWN = 2;
}

message events {
    repeated b.event curevent = 1;
    uint32 val = 2;
}

b.proto

syntax = "proto3";
import "a.proto";

package b;

message event {
     a.cert certificate = 1;
     a.state curstate = 2;
}

当我尝试生成 cpp 文件时,出现以下错误

# protoc -I. --cpp_out=. b.proto b.proto: File recursively imports itself: b.proto -> a.proto -> b.proto

如何做到这一点?

注意:使用的协议版本是libprotoc 3.3.0

【问题讨论】:

  • 如果它是相互依赖的,那么将共享部分移动到 c.proto 将起作用 - 但是,看看你的场景,我认为除了将所有内容都移动到一个文件之外,这无法解决。

标签: protocol-buffers protoc proto


【解决方案1】:

proto 编译器不允许你包含循环依赖。您将不得不组织您的代码,以便没有任何递归导入。上述示例代码的一种组织形式可能是:

a.proto

syntax = "proto3";

package a;

message cert {
    string filename = 1;
    uint32 length = 2;
}

enum state {
    UNDEFINED = 0;
    UP = 1;
    DOWN = 2;
}

b.proto

syntax = "proto3";
import "a.proto";

package b;

message event {
    a.cert certificate = 1;
    a.state curstate = 2;
}

message events {
    repeated event curevent = 1;
    uint32 val = 2;
}

您的events 类型不使用来自a.proto 的任何内容,并且还使用来自b.protoevent 类型。将其移至b.proto 是有意义的。

【讨论】:

  • 但是当你编译a.proto时,你不会包含b.proto。所以如果你编译b.proto你会得到a.proto,但是一旦你得到c.protod.protoe.proto,你会再次遇到问题。
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多