我正在尝试构建一个自定义 protoc 插件来从 .proto 文件生成自定义输出。我从protoc 自定义插件中复制了包含 CodeGenerator 的 java 文件作为起点并将其重命名。我还关注了可执行文件并创建了 .sh 文件。我的shell脚本的内容如下。
我还添加了插件执行的 PATH 变量值和输出。有人可以指出我哪里出了问题吗?shell 脚本运行良好,分别执行 main 方法
我正在尝试构建一个自定义 protoc 插件来从 .proto 文件生成自定义输出。我从protoc 自定义插件中复制了包含 CodeGenerator 的 java 文件作为起点并将其重命名。我还关注了可执行文件并创建了 .sh 文件。我的shell脚本的内容如下。
我还添加了插件执行的 PATH 变量值和输出。有人可以指出我哪里出了问题吗?shell 脚本运行良好,分别执行 main 方法
如果那是您的全部example.sh
,它将不起作用,因为它没有标识脚本解释器的“hashbang”行。
它应该是这样的:
#!/bin/bash
set -e
java cp ...
我认为这可能是您的问题,因为我尝试以protoc
与您相同的方式运行和指定插件,并且只要插件实际上可以自行执行,它就可以工作。
错误消息在protoc
这里有点神秘。您有 3 个选项来提供插件protoc
:
$PATH
您遵循protoc-gen-$NAME
格式的插件。这将被自动拾取。$PATH
. 这可以使用--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 工作目录可能不是当前文件夹。