使用 Go 模块时生成存储库内原型的最佳实践



tl;dr以前配置为使用GOPATH的存储库现在配置为模块。一切都很好,更好。但是,protoc 正确 (!) 为在github.com/path/to/repo/protos结构的存储库中定义的 protobufs 生成 Golang 代码,而我现在希望这些代码在我的源代码中生成,而不是GOPATH。我正在移动它们以解决此问题。有没有更好的解决方案?


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

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

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

迁移到 Go 模块并非没有痛苦,但好处大于成本,我正在为自己和代码提供未来的证明。

我的问题是我不明白如何让protoc将 Golang 绑定生成到我的任意和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 包一起放在${TOOLBOX}/protospackage protos.

最新更新