ProtoBuf 中关于 proto 文件的组织方式的疑问?

2023-01-30 14:15:14 +08:00
 liuguangxuan

背景:

在开发 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 。

804 次点击
所在节点    程序员
3 条回复
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;
}
leonshaw
2023-01-30 14:30:41 +08:00
用 Any ?
liuguangxuan
2023-01-30 17:24:06 +08:00
@3dwelcome 在执行 protoc 之前,先执行 shell 脚本,脚本对 proto 文件做预处理,没有定义的变量中间的行就删除?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/911632

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX