go - 使用 Go 模块时生成 in-repo protos 的最佳实践

标签 go grpc go-modules

tl;dr 以前配置为使用 GOPATH 的 repo 现在配置为模块。一切都很好,越来越好。但是,protoc 正确地(!)为在 github.com/path/to/repo/protos 结构中的 repo 中定义的 protobufs 生成 Golang 代码,而我现在更喜欢在我的源代码中生成这些代码,在 GOPATH 之外。我正在移动他们来解决这个问题。有更好的解决方案吗?


我有一个 GitHub 存储库。为了方便讨论,我们称它为 github.com/acme/toolbox。在子目录中,我有 protobuf 文件,其中包括:

package acme.toolbox.v1;
option go_package = "github.com/acme/toolbox/protos";

当我使用 GOPATH 时,一切都很好,protoc 会在 $GOPATH/src/github.com/acme/toolbox/中生成 Golang 绑定(bind)protos 和我的代码,导入 pb "github.com/acme/toolbox/protos",就可以了。

移动到 Go Modules并非没有痛苦,但 yield 大于成本,我正在让自己和代码面向 future 。

我的问题是,我不知道如何让 protoc 将 Golang 绑定(bind)生成到我的 GOPATH 之外的克隆中。

文件生成后我正在移动文件,但这感觉...不雅观:

cd ${TOOLBOX}
protoc \
--proto_path=./protos \
--go_out=plugins=grpc:/go/src
./protos/*.proto
mv ${GOPATH}/src/github.com/acme/toolbox/protos/*.go ${TOOLBOX}/protos

有没有更好的解决方案?

最佳答案

go_package 选项的要点是定义 go 包名称。话虽如此,它的行为也可能因您的设置而异。

如果 option go_package 被定义为有效的 go 包名称(例如 protos),protoc 将在 --go_out 定义的文件夹中生成文件 与该包名称。如果 option go_package 是路径(例如 github.com/acme/toolbox/protos),protoc 将创建相对于 --go_out< 定义的文件夹结构 并将文件放在那里,包名称与上一个文件夹名称相同。

除非我弄错了你想要做什么,否则你可以将 go_package 更改为:

option go_package = "protos";

并将您的 protoc 调用更改为:

protoc \
--proto_path=./protos \
--go_out=plugins=grpc:${TOOLBOX}/protos
./protos/*.proto

这样做,生成的文件将与 go package package protos 一起放置在 ${TOOLBOX}/protos 中。

关于go - 使用 Go 模块时生成 in-repo protos 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978791/

相关文章:

go - Golang 中的返回接口(interface)

go - 无法通过 Upstart 启动 Golang Prog

java - 如何通过 gRPC 发送网络钓鱼防护 API key ?

golang grpc transport.newBufWriter 和 bufio.NewReaderSize 不释放内存

go - 替换go.sum中的字符串

go - 将库更新为特定版本

HTML - 查找给定标签中的所有子标签

logging - 如何向 io.MultiWriter 添加/删除按需编写器?

java.lang.IndexOutOfBoundsException - 使用 Protocol buffer 构建 Java 对象时

go - 模块声明为 X 但要求为 Y