我正在尝试为内部专有编程语言编写自定义代码生成器。我想我可以使用protoc插件指南用Java编写生成器。我的main()做这样的事情:

public static void main(String[] args) throws IOException {
    CodeGenerator gen = new CodeGenerator();
    PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes());
    codeGeneratorRequest.getProtoFileList().forEach(gen::handleFile);
    // get the response and do something with it
    //PluginProtos.CodeGeneratorResponse response = PluginProtos.CodeGeneratorResponse.newBuilder().build();
    //response.writeTo(System.out);
}

(显然,我才刚刚开始;想在实际编写生成逻辑之前先进行一些简单的工作)

问题是:如何使用--plugin参数调用protoc以使用我的插件以自定义语言生成代码?我试图编写一个shell脚本来做到这一点:
#!/bin/bash
java -cp ./codegen.jar CodeGeneratorMain "$@"

我尝试像这样调用协议(protocol):protoc --plugin=protoc-gen-code --code_out=./build hello.proto,但是当我运行它时,出现以下错误:



好像它根本没有在stdin上传递CodeGeneratorRequest。我将如何验证?我做错了什么吗?

最佳答案

因此,在阅读并重新阅读了文档之后,我意识到了我非常愚蠢的错误:protoc通过 stdin 而不是argv传递了解析后的输入。这意味着,如果我将以下内容:PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes());更改为以下内容:PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(System.in);
有用。

关于java - 如何用Java编写自定义的Protobuf CodeGenerator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41432876/

10-11 04:24