如何跨多个Protocol Buffer文件共享消息定义用于RPC声明?
跨Protocol Buffer文件共享消息定义的可行方法
你的需求完全可以实现,protoc本身支持跨文件共享消息定义,你遇到的问题大概率是编译命令或文件结构配置不当,而非语法不支持。以下是具体实现方案:
规范文件结构
建议采用清晰的目录结构区分共享定义和服务文件,示例结构如下:project/ ├── common/ │ └── common.proto └── service/ └── my_service.proto编写共享消息文件
在common/common.proto中定义共享消息:package common; message EmptyMessage { }编写RPC服务文件
在service/my_service.proto中导入共享文件并使用其中的消息:syntax = "proto3"; // 建议显式指定proto版本,避免默认版本带来的兼容问题 import "common/common.proto"; package service; service MyService { rpc MyEndPoint (common.EmptyMessage) returns (common.EmptyMessage); }正确执行编译命令
编译时必须通过--proto_path(简写-I)参数指定proto文件的根目录,让protoc能正确找到被导入的文件。比如在project根目录下执行(以生成Go代码为例,其他语言替换对应输出参数即可):protoc -I=. common/common.proto service/my_service.proto --go_out=.
这样编译后生成的代码会直接复用共享的EmptyMessage定义,完全不需要别名重定向,达到减少冗余代码的目的。如果你的protoc版本较旧,建议升级到最新稳定版,旧版本可能存在import路径的兼容问题。
内容的提问来源于stack exchange,提问作者user22335954
相关产品推荐
相关产品推荐

