从Golang结构体生成proto文件

16

我有一个 Golang 结构体,其中包含对其他结构体的引用。是否有自动化的方法可以从这些结构体生成 .proto 文件?

例如:

type A struct {
 a int
 b B
}

type B struct {
 c []C
}

type C struct {
 x int
}

应该生成:

消息A,B,C等,推荐使用proto3。

https://github.com/kubernetes/kubernetes/tree/master/cmd/libs/go2idl似乎与此相关,但未记录。是否有任何选项?

3个回答

27

我找到了这个包,它可以从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 文档。


为了避免被投票否决/标记,您应该不仅仅放一个链接。请提供必要的信息,以便即使链接失效,答案仍然有效。 - Jonathan
8
抱歉,这是我第一次写答案。之后我会注意的。 - Ker Li
1
编辑得非常好!不幸的是,我不知道这是否真正回答了问题,因为我不懂Go语言,但希望那些投反对票的人能看到你的更新并撤回/点赞,如果它是好的话。 - Jonathan

5
如果有人只需要生成纯protobuf消息而不需要任何gogo,mogo,blogo语法,则可以使用我最近编写的https://github.com/anjmao/go2proto。它非常简单,只需从包含结构体的给定go源包中生成proto消息。此外,它支持go模块。

1

如果有人在使用GO时遇到错误,只需设置GO111MODULE=off即可解决。

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

1
如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - Bracken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接