Alb*_*rto 4 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_files = true;
Run Code Online (Sandbox Code Playgroud)
现在我需要向生成的文件添加一些代码,我发现可以使用自定义插件(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);
}
Run Code Online (Sandbox Code Playgroud)
然后我跑
protoc --java_out=./classes --plugin=protoc-gen-demo=my-plugin --demo_out=. example.proto
Run Code Online (Sandbox Code Playgroud)
问题是,在我的Test.java主要方法中,我不知道如何访问该选项创建的文件,--java_out以便我可以使用它们的插入点。目前CodeGeneratorResponse默认实例的 是空的(没有文件)。
有谁知道如何从 --java_out 获取,CodeGeneratorResponse以便我可以向生成的类添加更多代码?
提前致谢。
我最近也在为此苦苦挣扎,但找不到一个好的答案。在盯着CodeGeneratorResponse消息中的注释一段时间后,我终于弄清楚了。
一开始让我感到困惑的是,我将插件视为一个管道,其中一个插件的输出会输入到下一个插件中。然而,每个插件都会获得完全相同的输入(通过消息表示的解析的 .proto 文件CodeGeneratorRequest),并且插件生成的所有代码(包括内置代码)都会合并到输出文件中。但是,插件可能会修改以前插件的输出,这就是插入点的设计目的。
具体针对您的问题,您可以file在响应中添加 a ,并将name字段设置为生成的 Java 文件的名称,将insertion_point字段设置为要添加代码的插入点的名称,并将字段content设置为到您想要在此时插入的代码。
我发现这篇文章有助于创建一个简单的插件(在本例中是 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"
Run Code Online (Sandbox Code Playgroud)
然后我用插件运行 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)
}
Run Code Online (Sandbox Code Playgroud)
你的插件只需要是一些可执行文件,它CodeGeneratorRequest从 stdin 读取消息并将CodeGeneratorResponse消息写入 stdout,因此当然可以用 Java 编写。我只是选择了 python,因为我通常更喜欢它,并找到了这个简单的例子。
作为参考,这是我编写的一个插件,用于根据自定义 protobuf 选项生成代码。
| 归档时间: |
|
| 查看次数: |
3917 次 |
| 最近记录: |