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

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

C:\shekhar\proto_trial>dir
 Volume in drive C is C

 Directory of C:\shekhar\proto_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:\shekhar\proto_trial>protoc 
                       --proto_path=C:\shekhar\proto_trial 
                       --java_out=C:\shekhar\proto_trial\java_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 harder than you think).

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

Ответы

Ответ 1

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

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

Ответ 2

Здесь вариант с помощью поиска

protoc --js_out=js \
        -Iproto/ \
        $(find proto/google -iname "*.proto")

Ответ 3

Загрузите версию программного обеспечения 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>

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

Ответ 4

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

Мне кажется, что обычная команда в Windows работала только для Protobuf & lt; = 3.4, и в более новых версиях вы не можете использовать подстановочный знак *, но вы должны поместить все имена файлов отдельно. К счастью, все еще легко использовать цикл for (из здесь), используя относительные каталоги:

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

Ответ 5

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

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

Ответ 6

находить. -name "*.proto" | xargs -I {} protoc "{}"