使用 Go Modules 时生成 in-repo 原型的最佳实践
Best practice for the generation of in-repo protos when using Go Modules
tl;dr 以前配置为使用 GOPATH
的存储库现在配置为模块。一切都很好,越来越好。但是,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/protos
中生成 Golang 绑定,我的代码,导入 pb "github.com/acme/toolbox/protos"
,会工作。
迁移到 Go Modules 并不是 pain-free,但是收益大于成本,我 future-proofing 我自己和代码。
我的问题是我不知道如何让 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}/protos
中 package protos
。
tl;dr 以前配置为使用 GOPATH
的存储库现在配置为模块。一切都很好,越来越好。但是,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/protos
中生成 Golang 绑定,我的代码,导入 pb "github.com/acme/toolbox/protos"
,会工作。
迁移到 Go Modules 并不是 pain-free,但是收益大于成本,我 future-proofing 我自己和代码。
我的问题是我不知道如何让 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}/protos
中 package protos
。