Пользовательский плагин protoc выдает ошибку: Программа не найдена или не исполняется

Я пытаюсь создать собственный плагин protoc для создания пользовательского вывода из файлов.proto. Я буквально скопировал java-файл, содержащий CodeGenerator, из настраиваемого плагина protoc в качестве отправной точки и переименовал его. Я также следил за исполняемым файлом и создал файл.sh. Содержание моего сценария оболочки следующее.

Я также добавляю значение переменной PATH и вывод выполнения плагина. Может ли кто-нибудь указать мне, где я ошибаюсь? Сценарий оболочки работает нормально, отдельно выполняя основной метод

3 ответа

Если это весь твой example.sh, это не сработает, потому что в нем нет строки "hashbang", идентифицирующей интерпретатор скрипта.

Это должно быть примерно так:

#!/bin/bash
set -e
java cp ...

Думаю, это скорее всего ваша проблема, потому что я пробовал запустить protoc и указав подключаемый модуль таким же образом, как и вы, и он работал до тех пор, пока подключаемый модуль был фактически исполняемым сам по себе.

Сообщение об ошибке здесь немного загадочно. У вас есть 3 варианта предоставления плагина для:

  1. Плагин для подписки на protoc-gen-$NAMEформат. Это будет автоматически получено.
  2. Плагин, не соответствующий вышеуказанному соглашению об именах, но доступный в вашем. Это может быть выполнено с помощью --plugin=$some-nonconventional-name.
  3. Плагин не в вашем $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 может не быть текущей папкой.

Другие вопросы по тегам