Пользовательский плагин protoc выдает ошибку: Программа не найдена или не исполняется
Я пытаюсь создать собственный плагин protoc для создания пользовательского вывода из файлов.proto. Я буквально скопировал java-файл, содержащий CodeGenerator, из настраиваемого плагина protoc в качестве отправной точки и переименовал его. Я также следил за исполняемым файлом и создал файл.sh. Содержание моего сценария оболочки следующее.
Я также добавляю значение переменной PATH и вывод выполнения плагина. Может ли кто-нибудь указать мне, где я ошибаюсь? Сценарий оболочки работает нормально, отдельно выполняя основной метод
3 ответа
Если это весь твой example.sh
, это не сработает, потому что в нем нет строки "hashbang", идентифицирующей интерпретатор скрипта.
Это должно быть примерно так:
#!/bin/bash
set -e
java cp ...
Думаю, это скорее всего ваша проблема, потому что я пробовал запустить protoc
и указав подключаемый модуль таким же образом, как и вы, и он работал до тех пор, пока подключаемый модуль был фактически исполняемым сам по себе.
Сообщение об ошибке здесь немного загадочно. У вас есть 3 варианта предоставления плагина для:
- Плагин для подписки на
protoc-gen-$NAME
формат. Это будет автоматически получено. - Плагин, не соответствующий вышеуказанному соглашению об именах, но доступный в вашем. Это может быть выполнено с помощью
--plugin=$some-nonconventional-name
. - Плагин не в вашем
$PATH
. Для этого требуется указать абсолютный или относительный путь (от текущего рабочего каталога) к исполняемому файлу. Это выполняется с--plugin=proto-gen-$any-name-you-want=$path-to-executable
Расширяясь на 3 выше. Если вы создаете файл
example-plugin
:
#!/bin/bash
echo "Example Plugin Running!"
Затем вы захотите убедиться, что он исполняемый:
chmod +x ./example-plugin
Нам нужен выходной каталог, давайте его создадим:
mdkir plugin-output
Нам нужен
.proto
файл. Найдите один и назовите его как хотите, например
MyProto.proto
Выберем произвольное имя для этого плагина. Мы можем назвать это
foo
.
Затем вы выполните его с помощью
protoc
следующим образом:
protoc --plugin=protoc-gen-foo=$PATH_TO_EXAMPLE_PLUGIN --foo_output=./plugin-output MyProto.proto
Вы должны увидеть что-то вроде:
--foo_out: protoc-gen-foo: Plugin output is unparseable: Example Plugin Running!\n
Как насчет использования абсолютного пути example.sh? Рабочий каталог protoc может не быть текущей папкой.