Protocol buffers 如何将自己的代码添加到proto文件中JAVA生成的类中?
我使用protobuf,并从下面的proto文件生成JAVA类Protocol buffers 如何将自己的代码添加到proto文件中JAVA生成的类中?,protocol-buffers,protoc,protobuf-java,Protocol Buffers,Protoc,Protobuf Java,我使用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_f
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;
现在我需要向生成的文件中添加一些代码,我发现使用自定义插件()是可能的。我正在尝试用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
main方法中,我不知道如何访问由选项--java\u out
创建的文件,以便使用它们的插入点。当前默认实例的CodeGeneratorResponse
为空(无文件)
有人知道如何从--java_中获取codeneratorresponse
,以便向生成的类添加更多代码吗
提前谢谢。我最近也在努力解决这个问题,没有找到一个好的答案。我盯着留言里的评论看了一会儿,终于明白了 一开始让我感到不舒服的是,我把插件看作是一条管道,从一个插件输出到下一个插件。但是,每个插件获得完全相同的输入(解析的.proto文件通过
codeneratorrequest
消息表示),并且从插件(包括内置插件)生成的所有代码都被合并到输出文件中。然而,插件可能会修改以前插件的输出,这就是插入点的设计目的
特别是针对您的问题,您将在响应中添加一个文件
,其中名称
字段设置为生成的Java文件的名称,插入点
字段设置为要添加代码的插入点的名称,而content
字段设置为您希望在该点插入的代码
我发现创建一个简单的插件(在本例中是python)很有帮助。作为一个简单的测试,我修改了那篇文章中的generate\u 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"
然后我用插件运行protoc:
$ 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读取codeneratorrequest
消息,并将codeneratorresponse
消息写入stdout,因此当然可以用Java编写。我只是选择了python,因为我对它比较熟悉,并找到了这个简单的示例
作为参考,我编写了基于自定义protobuf选项生成代码的代码。我制作了一个自定义python插件。 要运行我的插件,我使用以下命令:
protoc--plugin=protoc gen custom=my\u plugin\u executable\u file--custom\u out=./build test.proto
因此,我认为,您必须从.java文件生成一个可执行文件,并在命令中使用它。您有没有想过这个问题?或者你有没有一个例子来说明你在做什么?哇。这是很难找到的信息。我认为插件链也可以作为管道工作。谢谢!