【问题标题】:Generate proto file from golang struct从 golang 结构生成 proto 文件
【发布时间】:2016-12-08 01:14:03
【问题描述】:

我有一个 golang 结构,其中包含对其他一些结构的引用。有没有一种自动的方法来从结构中生成 .proto 文件?

例如:

type A struct {
 a int
 b B
}

type B struct {
 c []C
}

type C struct {
 x int
}

应该生成:

message A, B, C 等 proto3 是首选。

https://github.com/kubernetes/kubernetes/tree/master/cmd/libs/go2idl 似乎有一些相关但没有记录。有什么选择吗?

【问题讨论】:

    标签: go protocol-buffers


    【解决方案1】:

    我找到了包,从 Go 源代码生成 .proto 文件: proteus (https://github.com/src-d/proteus)

    Proteus /proʊtiəs/ 是一个从 Go 结构、类型和函数生成协议缓冲区版本 3 兼容的 .proto 文件的工具。

    这个库背后的动机是使用 Go 作为模型的真实来源,而不是相反,然后从 .proto 文件生成 Go 代码,该文件不会生成惯用代码。

    生成 protobuf 消息

      //proteus:generate
      type User struct {
            Model
            Username string
      }
    
      type Model struct {
            ID int
            CreatedAt time.Time
      }
    

    此示例将生成以下 protobuf 消息。

      message User {
              int32 id = 1;
              google.protobuf.Timestamp created_at = 2;
              string username = 3;
      }
    

    安装

     go get -v gopkg.in/src-d/proteus.v1/...
    

    要求

    整个流程有两个要求。

     protoc binary installed on your path
     go get -u github.com/gogo/protobuf/...
    

    用法

    您可以为您的 Go 类型、RPC 客户端和服务器接口以及您的包的 RPC 服务器实现生成 proto 文件、marshal/unmarshal 和其余 protobuf 内容。也就是整个过程。

     proteus -f /path/to/protos/folder \
        -p my/go/package \
        -p my/other/go/package
    

    您只能使用 proteus 提供的命令行工具生成 proto 文件。

     proteus proto -f /path/to/output/folder \
        -p my/go/package \
        -p my/other/go/package
        --verbose
    

    您也可以只为您的包生成 gRPC 服务器实现。

      proteus rpc -p my/go/package \
        -p my/other/go/package
    

    注意:当然,如果默认值不适合您的需要,在 proteus 可以通过插件扩展之前,您可以使用提供的组件组合您自己的生成器命令。查看包的 godoc 文档。

    【讨论】:

    • 为避免被否决/标记,您应该放置的不仅仅是一个链接。输入基本信息,以便即使链接断开,答案仍然有效。
    • 对不起,这是我第一次写答案。以后会注意的
    • 编辑工作做得很好!不幸的是,我不知道这是否真的回答了这个问题,因为我不知道 Go,但希望任何投反对票的人都会看到你的更新,如果它是好的,则撤回/投赞成票。
    【解决方案2】:

    如果有人只需要生成没有任何 gogo、mogo、blogo 语法的纯 protobuf 消息,您可以使用我最近写的 https://github.com/anjmao/go2proto。它非常简单,只需从包含结构的给定 go 源包生成原始消息。它还支持 go 模块。

    【讨论】:

      【解决方案3】:

      如果有人在 GO Get Error 中找到这里。你只需要 GO111MODULE=off

      GO111MODULE=off  go get -v gopkg.in/src-d/proteus.v1/...
      GO111MODULE=off go get -v -u  github.com/gogo/protobuf/...
      

      【讨论】:

      • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
      猜你喜欢
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2018-08-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多