Как скомпилировать несколько прото файлов в одной команде?
У меня есть два файла 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 "{}"