Как правильно указать расположение моих протофайлов в буферах протокола?

Вот три файла, с которыми я работаю:

// city.proto
syntax = "proto3";
package city;

message City {

    string cityName = 1;
    string zipCode = 2;
    string countryName = 3;

}

// street.proto
syntax = "proto3";

import "Exercise/city.proto";
package street;

message Street {

    string cityName = 1;
    city.City city = 2;

}

// building.proto
syntax = "proto3";

import "Exercise/street.proto";
package building;

message Building {

    string buildingName = 1;
    string buildingNumber = 2;
    street.Street street = 3;

}

Это моя текущая структура каталогов:

   - PROTOCOLBUFFERS (folder on desktop)
        - Exercise
           - city.proto
           - street.proto
           - building.proto

Это команда, которую я использую для генерации кода из протофайлов protoc -I="."/Exercise --java_out=Exercise Exercise/*.proto

Я запускаю эту команду со своим терминалом в папке PROTOCOLBUFFERS.

Что я делаю неправильно при выполнении этой команды? Я на окнах. Это сообщение об ошибке, которое я получаю, и поиск в Интернете не дал результатов.

building.proto:3:1: Импорт упражнения/street.proto не найден или содержит ошибки.
building.proto:10:5: улица.Улица не определена.


person Mutating Algorithm    schedule 28.11.2020    source источник


Ответы (2)


Я не знаком с запуском protoc в Windows, но...

Попробуйте каждый из них по очереди:

  1. Замена разделителя пути Linux / на разделитель Windows \.
  2. Используя абсолютные пути от корня диска: protoc --proto_path=c:\...\Exercise --java_out=Exercise c:\...\Exercise\*.proto, т.е. замените c:\... на правильный путь.
  3. Если это не сработает, замените один подстановочный знак (*.proto) полными путями к каждому прототипу c:\...\Exercise\city.proto c:\...\Exercise\building.proto c:\...\Exercise\street.proto.

protoc разборчив. Если вам нужно использовать proto_path, вы должны повторить соответствующий путь в последующих ссылках на прото-файлы.

Я удивлен, увидев, что документация предполагает, что импорт не поддерживается в Java!? Я использую языки, отличные от Java, и был бы удивлен, если бы это было правдой, но это то, что он говорит:

https://developers.google.com/protocol-buffers/docs/proto3#importing_definitions

person DazWilkin    schedule 28.11.2020

Вам следует изменить путь импорта в прото-файлах: они уже находятся в той же папке. Итак, измените, например:

// street.proto
syntax = "proto3";

import "city.proto";

вместо

// street.proto
syntax = "proto3";

import "Exercise/city.proto";

После этого исправления команда создает файлы как:

.
├── Exercise
│   ├── building
│   │   └── BuildingOuterClass.java
│   ├── building.proto
│   ├── city
│   │   └── CityOuterClass.java
│   ├── city.proto
│   ├── street
│   │   └── StreetOuterClass.java
│   └── street.proto
└── README.md

Надеюсь, это поможет

person Matteo    schedule 06.12.2020