从 golang 结构生成 proto 文件

Generate proto file from golang struct

我有一个 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 源代码生成 .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 类型生成 proto 文件、marshal/unmarshal 和其余的 protobuf 内容,为您的包生成 RPC 客户端和服务器接口以及 RPC 服务器实现。也就是整个过程。

 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 文档。

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

如果有人在 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/...