【问题标题】:Best practice for the generation of in-repo protos when using Go Modules使用 Go Modules 时生成 in-repo 原型的最佳实践
【发布时间】:2019-07-11 21:59:14
【问题描述】:

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


我有一个 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 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

有没有更好的解决方案?

【问题讨论】:

    标签: go grpc go-modules


    【解决方案1】:

    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 protos 一起放在 ${TOOLBOX}/protos 中。

    【讨论】:

    • 谢谢。我认为这种方法会奏效。但是,Go Modules 提供了将我的项目定义为例如github.com/acme/toolbox 即使文件存储在任意目录中。这是因为 go.mod 包含一个引用该 github 路径的 module 前缀。如果——也许这是我的错误——protos 是项目的子目录,我项目中的 Go 文件应该使用模块前缀引用它的文件。
    • 经过反思,这正是正确的答案。由于某些(愚蠢的)原因,我没有考虑使用go_package 使用${GOPATH} 值的后果。你当然是对的。我将go_package 修改为protos,并在我想要的位置生成绑定。谢谢!
    • 谢谢雅各布。第一句话救了我的命。谷歌需要用简单的方式来解释事情......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2011-07-11
    相关资源
    最近更新 更多