我使用protobuf并且我从以下proto文件生成JAVA类。
syntax = "proto3";
enum Greeting {
NONE = 0;
MR = 1;
MRS = 2;
MISS = 3;
}
message Hello {
Greeting greeting = 1;
string name = 2;
}
message Bye {
string name = 1;
}
option java_multiple_files = true;
现在我需要为生成的文件添加一些代码,我发现可以使用自定义插件(https://developers.google.com/protocol-buffers/docs/reference/java-generated#plugins)。我试图用Java生成该插件,就像这样。
public class Test {
PluginProtos.CodeGeneratorResponse.getDefaultInstance();
/* Code to get generated files from java_out and use the insertion points */
codeGeneratorResponse.writeTo(System.out);
}
然后我跑
protoc --java_out=./classes --plugin=protoc-gen-demo=my-plugin --demo_out=. example.proto
问题在于,在我的Test.java
主要方法中,我不知道如何访问选项--java_out
创建的文件,以便我可以使用他们的插入点。目前,默认实例的CodeGeneratorResponse
为空(无文件)。
有人知道如何从--java_out获取CodeGeneratorResponse
以便我可以向生成的类添加更多代码吗?
提前致谢。
答案 0 :(得分:0)
我最近也为此感到挣扎,无法找到一个好的答案。盯着CodeGeneratorResponse消息中的评论一段时间后,我终于明白了。
最初让我失望的是,我将插件视为一条管道,其中一个输出将其馈送到下一个。但是,每个插件都获得完全相同的输入(通过CodeGeneratorRequest
消息表示的已解析的.proto文件),并且从插件生成的所有代码(包括内置代码)都将合并在一起进入输出文件。但是,插件可能会修改以前的插件的输出,这就是设计插入点的目的。
具体针对您的问题,您需要在响应中添加file
,其中name
字段设置为生成的Java文件的名称,insertion_point
字段设置为要添加代码的插入点的名称,并且content
字段设置为要在该点插入的代码。
我发现this article有助于创建简单的插件(在本例中为python)。作为一个简单的测试,我修改了该文章中的generate_code
函数,使其看起来像这样:
def generate_code(request, response):
for proto_file in request.proto_file:
f = response.file.add()
f.name = "Test.java"
f.insertion_point = "outer_class_scope"
f.content = "// Inserting a comment as a test"
然后我使用该插件运行了协议
$ cat test.proto
syntax = "proto3";
message MyMsg {
int32 num = 1;
}
$ protoc --plugin=protoc-gen-sample=sample_proto_gen.py --java_out=. --sample_out=. test.proto
$ tail -n3 Test.java
// Inserting a comment as a test
// @@protoc_insertion_point(outer_class_scope)
}
您的插件只需要一个可执行文件即可从stdin读取CodeGeneratorRequest
消息并将一条CodeGeneratorResponse
消息写入stdout,因此可以肯定地用Java编写。我只是选择了python,因为我通常更喜欢它,并找到了这个简单的示例。
答案 1 :(得分:0)
我做了一个自定义的python插件。 要运行我的插件,请使用以下命令:
protoc --plugin=protoc-gen-custom=my_plugin_executable_file --custom_out=./build test.proto
所以我认为,您必须从.java文件生成可执行文件,然后在命令中使用它。