了解 protobuf 导入和输出相对路径

Understanding protobuf import and output relative paths

我相当确定这是操作员错误,我现在没有想清楚。

设置如下:

$GOPATH/src/github.com/<company>/<service a>/proto/a.proto
$GOPATH/src/github.com/<company>/<service b>/proto/b.proto

等等

现在在原始文件中,我使用类似于 go 的导入(可能是问题所在),因此 a.proto 具有: import "github.com/<company>/<service b>/b.proto"

我可能有两个不同的问题。

  1. 我无法使用 go:generate protoc
  2. 正确编译导入
  3. 我无法将输出 a.pb.go 文件放置在 $GOPATH/src/github.com/<company>/<service a>/proto/ 路径中。

我尝试了多种配置,但组合可能不正确。 Using option go_package = "github.com/<company>/<service b>/proto" 在每个 .proto 文件中

go generate 的多种变体;

go:generate protoc --proto_path=.:$GOPATH/src --go_out=$GOPATH/src a.proto
go:generate protoc --proto_path=.:$GOPATH/src --go_out=. a.proto 
go:generate protoc --go_out=import_prefix=github.com/<company>/:. api.proto

我显然对 protoc 如何查看导入路径和文件输出的理解很差。有人指出我做错了什么吗?

谢谢!

更新#1 在 a.proto;

option go_package = "github.com/<company>/<service a>/proto";

import "github.com/<company>/<service b>/proto/b.proto";

go 生成;

//go:generate protoc --proto_path=$GOPATH/src --go_out=$GOPATH/src/github.com/<company>/<service a>/proto a.proto

这是从 proto 目录中的一个 go 文件调用的 a.proto。

我收到错误; a.proto:文件不在使用 --proto_path(或 -I)指定的任何路径中。您必须指定一个 --proto_path ch 包含此文件。请注意,proto_path 必须是 .proto 文件名的精确前缀——protoc 太笨了,无法弄清楚两个路径(例如绝对路径和相对路径)何时相等(这比你想象的要难)。

我已确认 $GOPATH 位于预期位置。

解决方案

感谢 Shivam Jindal 为我指明了正确的方向。导入与他的解决方案中描述的完全相同。输出是我滥用 --go_out 和选项 go_package 的问题。我使用 go_package 指定输出位置,使用 --go_out 指定类似于 --proto_path 的根目录。现在一切正常。

option go_package = "github.com/<company>/<service a>/proto";

//go:generate protoc --proto_path=$GOPATH/src/ --go_out=$GOPATH/src/ $GOPATH/src/github.com/<company>/<service a>/proto/a.proto

谢谢!

首先,option go_package 根本不是用于其他依赖项导入的,它是 Go 包名称,Go (a.pb.go file) 的新原型绑定将放置在该包名称中。

现在来到输出文件位置,我可以看到你正在使用go-generate。首先,如果 --go_out= 中使用的路径是相对路径,则取决于您从哪个目录调用。我会说使用绝对路径。如果您想将输出文件放在您提到的那个位置,请在 go-generate 中使用 --go_out=$GOPATH/src/github.com/<company>/<service a>/proto/

要在您的 a.proto 中正确导入另一个文件 b.proto,请像您所做的那样使用完全限定的导入路径。只是在 go-generate 中使用 --proto_path $GOPATH/src。另外请用您看到的错误更新问题,以防它不起作用。

有关导入路径的详细信息,请参阅 this