4

tl;dr以前配置为使用的 repoGOPATH现在配置为模块。一切都好,越来越好。但是,github.com/path/to/repo/protos当我现在更喜欢在我的源代码中生成这些在GOPATH. 我正在移动他们来解决这个问题。有更好的解决方案吗?


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

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

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

迁移到Go Modules并非没有痛苦,但好处大于成本,我正在为自己和代码进行面向未来的验证。

我的问题是我看不到如何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

有更好的解决方案吗?

4

1 回答 1

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";

并将您的protoc调用更改为:

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

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

于 2019-07-11T00:59:42.147 回答