背景:
在开发 C/S 程序的时候,使用 ProtoBuf 作为服务端和客户端的通信协议,比如要开发一款软件,包括服务端和客户端,其中服务端仅有 1 个,但是客户端有多种,且客户端为不同的团队开发维护,在组织 proto 的时候,假如按照不同团队使用的 proto 按照文件夹分类,如下所示:
.
├── Administrator
│ └── admin.proto
├── CommonUser
│ └── user.proto
├── OtherUser
│ └── other.proto
└── Msg.proto
其中Msg.proto
为一个大的结构体,在里面区分不同的客户端,如下所示:
message Msg {
int32 ClientType = 1;
optional Administrator admin = 2;
optional CommonUser user = 3;
optional OtherUser other = 4;
}
疑问:
这样组织 proto 文件,服务端需要维护一份完整的 proto ,没有什么问题。
但是每个客户端都能看到完整的 proto 文件,如 CommonUser 也需要看到 Administrator 文件夹下的 proto ,否则用 protoc 生成 cpp 文件的时候会因为缺少 proto 文件无法生成。
请教各位老哥,像上述使用场景,服务端需要面对多个客户端(或者多种角色),不同客户端之间有共用的 proto ,也有各自的 proto ,这种应该怎么组织才合理?
隔离 proto 原因:
因为不同的客户端,他们的接口不一样,涉及到的接口权限不一样,所以不想让不同的客户端团队看到其他人的 proto ,才想着隔离 proto 。
1
3dwelcome 2023-01-30 14:29:05 +08:00
在 protoc 上面简单包个脚本,先调用一下预编译,就搞定了,
比如 message Msg { int32 ClientType = 1; #ifdef USER1 optional Administrator admin = 2; #endif #ifdef USER2 optional CommonUser user = 3; #endif optional OtherUser other = 4; } |
2
leonshaw 2023-01-30 14:30:41 +08:00
用 Any ?
|
3
liuguangxuan OP @3dwelcome 在执行 protoc 之前,先执行 shell 脚本,脚本对 proto 文件做预处理,没有定义的变量中间的行就删除?
|