【发布时间】:2020-04-22 06:21:22
【问题描述】:
我相当肯定这是操作员错误,我现在想不清楚。
设置如下:
$GOPATH/src/github.com/<company>/<service a>/proto/a.proto
$GOPATH/src/github.com/<company>/<service b>/proto/b.proto
等等
现在在 proto 文件中,我使用类似于 go(可能是问题)的导入,因此 a.proto 具有:
import "github.com/<company>/<service b>/b.proto"
我可能有两个不同的问题。
- 我无法使用
go:generate protoc正确编译导入 - 我无法将输出
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 在一个.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
谢谢!
【问题讨论】:
标签: go protocol-buffers