Как включить файлы .proto, имеющие взаимную зависимость

У меня есть два файла .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.


person Manu Thomas Mathew    schedule 28.07.2017    source источник
comment
Если бы это была взаимная зависимость, то перемещение общей части в c.proto сработало бы, однако, глядя на ваш сценарий, я не думаю, что это можно решить, если не перемещать все в один файл.   -  person Marc Gravell    schedule 28.07.2017


Ответы (1)


Компилятор proto не позволит вам включать циклические зависимости. Вам нужно будет организовать свой код так, чтобы не было рекурсивного импорта. Одна организация вашего примера кода выше может быть:

а.прото

syntax = "proto3";

package a;

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

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

б.прото

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, а также использует тип event из b.proto. Имеет смысл перенести его на b.proto.

person Ulas Keles    schedule 28.07.2017
comment
Но когда вы скомпилируете a.proto, у вас не будет b.proto. Итак, если вы скомпилируете b.proto, у вас будет a.proto, но как только вы получите c.proto, d.proto и e.proto, вы снова столкнетесь с проблемами. - person Robert de W; 19.12.2018