gpt4 book ai didi

protocol-buffers - 如何将我自己的代码从 proto 文件添加到 JAVA 生成的类中?

转载 作者:行者123 更新时间:2023-12-03 19:34:55 26 4
gpt4 key购买 nike

我正在使用 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 上main 方法我不知道如何访问由选项 --java_out 创建的文件这样我就可以使用他们的插入点。目前 CodeGeneratorResponse默认实例为空(无文件)。

有谁知道我怎样才能得到 CodeGeneratorResponse来自 --java_out 以便我可以向生成的类添加更多代码?

提前致谢。

最佳答案

我最近也在为此苦苦挣扎,无法找到好的答案。看了CodeGeneratorResponse里面的评论,我终于明白了。留言一会儿。
起初让我失望的是,我认为插件是一个管道,其中一个的输出馈入下一个。然而,每个插件获得完全相同的输入 (解析后的 .proto 文件通过 CodeGeneratorRequest 消息表示),并且所有从插件(包括内置插件)生成的代码都合并到输出文件中。但是,插件可能会修改先前插件的输出,这是插入点的设计目的。
具体到您的问题,您将添加 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"
然后我用插件运行 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)
}
你的插件只需要是一些可执行文件,它读取 CodeGeneratorRequest来自标准输入的消息并写入 CodeGeneratorResponse消息到标准输出,所以当然可以用 Java 编写。我只是选择了 python,因为我通常更习惯它并找到了这个简单的例子。
作为引用, here's a plugin我编写了基于自定义 protobuf 选项生成代码的代码。

关于protocol-buffers - 如何将我自己的代码从 proto 文件添加到 JAVA 生成的类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50806894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com