V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuguangxuan
V2EX  ›  程序员

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

  •  
  •   liuguangxuan · 2023-01-30 14:15:14 +08:00 · 893 次点击
    这是一个创建于 661 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:

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

    3 条回复    2023-01-30 17:24:06 +08:00
    3dwelcome
        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;
    }
    leonshaw
        2
    leonshaw  
       2023-01-30 14:30:41 +08:00
    用 Any ?
    liuguangxuan
        3
    liuguangxuan  
    OP
       2023-01-30 17:24:06 +08:00 via Android
    @3dwelcome 在执行 protoc 之前,先执行 shell 脚本,脚本对 proto 文件做预处理,没有定义的变量中间的行就删除?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:22 · PVG 08:22 · LAX 16:22 · JFK 19:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.