使用 Go Modules 时生成 in-repo protos 的最佳实践

Daz*_*kin 3 go grpc go-modules

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


我有一个 GitHub 仓库。为了讨论起见,我们称之为github.com/acme/toolbox。在一个子目录中,我有 protobuf 文件,其中包括:

package acme.toolbox.v1;
option go_package = "github.com/acme/toolbox/protos";
Run Code Online (Sandbox Code Playgroud)

当我在GOPATHing 时,一切都很好,并且protoc会在其中生成 Golang 绑定,$GOPATH/src/github.com/acme/toolbox/protos并且我的代码 importingpb "github.com/acme/toolbox/protos"可以工作。

迁移到Go Modules并非一帆风顺,但收益大于成本,我正在为自己和代码做未来证明。

我的问题是我不知道如何protoc将 Golang 绑定生成到我的任意GOPATH位置克隆之外。

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

package acme.toolbox.v1;
option go_package = "github.com/acme/toolbox/protos";
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?

Jac*_*ert 5

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";
Run Code Online (Sandbox Code Playgroud)

并将您的protoc调用更改为:

protoc \
--proto_path=./protos \
--go_out=plugins=grpc:${TOOLBOX}/protos
./protos/*.proto
Run Code Online (Sandbox Code Playgroud)

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