protoc 不生成服务存根文件

Posted

技术标签:

【中文标题】protoc 不生成服务存根文件【英文标题】:protoc not generating service stub files 【发布时间】:2015-09-10 20:09:10 【问题描述】:

我刚开始玩 google proto。当我尝试编译 proto-java 示例中存在的 proto 文件时,它不会生成任何 grpc 文件。

原始文件, https://github.com/grpc/grpc-java/blob/master/examples/src/main/proto/hello_world.proto

终端输出,

rsonkhla@raman-OptiPlex-9020:~/sandbox/grpc-java/examples$ protoc --version libprotoc 3.0.0 rsonkhla@raman-OptiPlex-9020:~/sandbox/grpc-java/examples$ protoc --java_out=test/ -I../../grpc-java/examples ../../grpc-java/examples/src/main/proto/hello_world.proto rsonkhla@raman-OptiPlex-9020:~/sandbox/grpc-java/examples$ ls -R test/ 测试/:io

测试/io:grpc

test/io/grpc:示例

test/io/grpc/examples: helloworld

test/io/grpc/examples/helloworld: HelloRequest.java HelloResponse.java HelloWorldProto.java HelloRequestOrBuilder.java HelloResponseOrBuilder.java

还有其他人遇到过这个问题吗?

【问题讨论】:

请忽略。我在编译时没有传递 protoc-gen-grpc-java 插件路径... rsonkhla@raman-OptiPlex-9020:~/sandbox/grpc-java/examples$ protoc --plugin=protoc-gen-java_rpc=../compiler/build/binaries/java_pluginExecutable/protoc- gen-grpc-java --java_rpc_out=test/ --java_out=test/ -I. src/main/proto/hello_world.proto test/io/grpc/examples/helloworld: GreeterGrpc.java HelloRequest.java HelloRequestOrBuilder.java HelloResponse.java HelloResponseOrBuilder.java HelloWorldProto.java 我用的是protobuf-maven-plugin,也无法生成服务存根文件。 【参考方案1】:

您可以将这些 option 添加到您的 .proto 中(基于您的语言)以生成抽象服务:

option cc_generic_services = true;
option java_generic_services = true;
option py_generic_services = true;

您还可以在您的protoc cmd 中添加--plugin=EXECUTABLE 选项,以使用自定义code generator plugin 生成更特定于每个系统的代码,而不是依赖“抽象”服务。就像 Eric 的建议一样。

【讨论】:

【参考方案2】:

您显示的命令行未启用 grpc 插件。您需要为 grpc 插件指定一个 _out 参数,该参数启用插件并指定它应该输出文件的位置。由于该插件可能不在您的PATH 中,因此您还需要告诉protoc 如何使用--plugin 找到该插件。

所以你需要添加两个参数:

--plugin=protoc-gen-grpc-java=path/to/protoc-gen-grpc-java --grpc-java_out=path/to/output/dir

有关详细信息,请参阅 gRPC compiler documentation。

【讨论】:

嗨,Eric,我正在努力完成这项工作,我已经从 maven 下载了 protoc-gen-grpc-java.jar,但无论我如何将它提供给那个参数,它仍然会告诉我说“文件未找到或不可执行”,也许我应该有一些其他的工件而不是 jar 文件? 你的“path/to/protoc-gen-grpc-java”是指向一个jar文件还是别的什么? path/to/protoc-gen-grpc-java 是一个二进制文件(例如,Linux 的原生 ELF 二进制文件)。它不是一个 JAR。您可以在search.maven.org/… 找到预构建版本(例如,linux-x86_32.exe,可以像--plugin=protoc-gen-grpc-java=path/to/linux-x86_32.exe 一样使用) 谢谢我已经从 github 项目编译了它,虽然它生成了无效的代码(grpc-all.jar 缺少一些在生成的代码中使用的代码)所以我刚刚创建了一个 gradle mini只处理 protobuf 部分的项目......我希望我们将来能对 sbt 有官方支持...... @EricAnderson Thans,这就是我想要的。但是,.exe后缀的ELF二进制,听上去真的很奇怪;)第一次发现的时候,我不相信它真的是需要的……

以上是关于protoc 不生成服务存根文件的主要内容,如果未能解决你的问题,请参考以下文章

为 JAX-RPC Web 服务生成 JAX-WS 客户端存根?

2022-04-06:go中proto文件能跨平台,那是因为能生成不同语言的代码,做框架开发用protoc+插件生成代码是不合适的,需要解析,请问如何解析?

使用protoc生成go类型文件

生成 gRPC 服务类失败

gRPC之.proto生成go文件并创建grpc服务端

将 'library' 指令添加到使用 protoc 生成的 dart 代码中