Как скомпилировать несколько файлов proto в одной команде?

у меня есть два файла proto внутри одного каталога, и я ищу способ генерировать классы из этих файлов в одной команде. Документация Protobuf говорит, что нам нужно использовать --proto_path аргумент для этого.

C:shekharproto_trial>dir
 Volume in drive C is C

 Directory of C:shekharproto_trial

07/25/2014  12:16 PM    <DIR>          .
07/25/2014  12:16 PM    <DIR>          ..
07/25/2014  12:16 PM    <DIR>          java_op
07/25/2014  12:16 PM               230 map.proto
07/23/2014  04:24 PM               161 message.proto
07/25/2014  12:17 PM             1,228 response.proto
               3 File(s)          1,619 bytes
               3 Dir(s)  50,259,398,656 bytes free

Я --proto_path аргументов, как показано ниже

C:shekharproto_trial>protoc 
                       --proto_path=C:shekharproto_trial 
                       --java_out=C:shekharproto_trialjava_op 
                       *.proto

, но я получаю следующую ошибку

message.proto: File does not reside within any path specified using --proto_path (or -I). 
You must specify a --proto_path which encompasses this file. 
Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

пожалуйста, предложите какой-то способ скомпилировать все файлы proto вместе в одном кадре.

4 ответов


проблема в том, что вы указываете --proto_path как абсолютный путь, но ваши файлы proto как относительные пути. Вы можете либо отбросить --proto_path аргумент (по умолчанию он все равно равен текущему каталогу), или вы можете сделать:

protoc --proto_path=C:\shekhar\proto_trial
       --java_out=C:\shekhar\proto_trial\java_op
       C:\shekhar\proto_trial\*.proto

загрузите версию компилятора windows по этой ссылке https://github.com/google/protobuf/releases/tag/v3.3.0

запустить командную строку из папки bin загруженного приложения. Используйте команду potoc для создания классов.

    protoc --proto_path=<Directory name where your proto file is residing> 
           --java_out=<Directory name where you want your output classes to get generated> 
           <absolute path of your protofile with extention>

использовать дикий символ * для нескольких protofiles


самый простой способ:

protoc C:\shekhar\proto_trial\*.proto --java_out=C:\shekhar\proto_trial\java_op

команды для Protobuf >= 3.5

мне кажется, что обычная команда в Windows работала только для Protobuf здесь), используя относительные каталоги:

for /f %i in ('dir /b proto_trial\*.proto') do protoc proto_trial\%i --java_out=proto_trial\java_op

или здесь, вы также можете попробовать использовать Git Bash, если он установлен как он можно правильно развернуть подстановочный знак, а затем использовать команду, как и раньше:

protoc proto_trial\*.proto --java_out=proto_trial\java_op