You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gRPC是否支持将服务端与客户端存根生成到不同目录?

gRPC服务端与客户端存根拆分生成到不同目录的实现方法

问题描述

我查阅了大量网络资料,希望确认是否能够将gRPC的服务端与客户端存根分别生成到不同目录中。目前我已经可以针对不同编程语言将存根生成到对应的独立目录,但始终无法找到将各语言对应的服务端文件与客户端文件拆分存放的实现方式,恳请大家提供相关技巧与建议。
——提问者:Mike

具体实现方案

完全可以实现拆分存放,核心逻辑是不要依赖默认的全量生成规则,通过生成参数控制输出内容和路径即可,不需要修改原有proto文件:

  • 通用实现思路:protoc的gRPC生成插件本身就支持单独控制生成服务端代码、客户端代码,你只需要分两次执行生成命令,第一次指定仅生成服务端代码、输出路径设为你的服务端目录,第二次指定仅生成客户端代码、输出路径设为你的客户端目录就行。
  • 常用语言操作示例:
    • Go:生成服务端代码到./grpc/server目录时执行:
      protoc --go_out=./grpc/server --go-grpc_out=./grpc/server yourservice.proto
      仅生成客户端代码到./grpc/client目录时,加上客户端专属生成参数:
      protoc --go_out=./grpc/client --go-grpc_out=./grpc/client --go-grpc_opt=generate_client_only=true yourservice.proto
    • Java/Kotlin:不管是用Maven还是Gradle的protobuf插件,新建两个独立的生成任务,第一个任务打开服务端生成开关、关闭客户端生成开关,输出路径指向服务端代码目录;第二个任务关闭服务端生成开关、打开客户端生成开关,输出路径指向客户端代码目录即可。
    • Python/Node.js/C++等其他语言:逻辑完全一致,查对应语言gRPC生成插件的参数说明,找到「仅生成服务端」「仅生成客户端」的控制参数,分两次执行生成命令指定不同输出目录即可。
  • 如果你用buf这类proto工程化管理工具,操作更简单:在buf.gen.yaml里配置两组独立的生成规则,一组对应服务端生成配置、输出到服务端目录,另一组对应客户端生成配置、输出到客户端目录,执行一次buf generate就能自动完成拆分输出,不用手写多条protoc命令。

注意事项

proto中定义的message、enum等通用数据结构代码是服务端和客户端都需要依赖的,这部分不需要强行拆分,两边目录各生成一份,或者抽成独立的公共包供两边引用都可以,不会出现逻辑冲突。

内容的提问来源于stack exchange,提问作者A Bit of Help

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:09:25