1 回答
TA贡献1963条经验 获得超6个赞
我发现这是Protobufs(和gRPC)中更令人困惑的方面之一。
我认为正在解决的问题是Protobufs需要:
允许名称间距以限定服务范围|消息的范围,例如 DNS 域
支持无数的编程语言(以不同的方式实现命名空间)。
protoc具有允许(重新)映射的选项,例如,使用protobuf选项将protobuf的包映射到特定于语言的命名空间,例如)。请参阅 Golang 的 Go 生成代码。v1/apigo_package
使用Go Modules时,这稍微复杂一些,但总而言之,您遇到的可能是上述某些(意外的)组合,其中示例代码假定一个模块名称,并且基于另一个模块名称的假设进行构建。protoc
TL;DR 更新代码的模块引用以反映正确生成的路径。如果生成代码位于错误的位置,则只需将其移动到正确的子目录(路径),但最好更新命令以将文件生成到正确的目录。pbprotoc
例
something.proto:
syntax = "proto3";
package v1alpha1;
option go_package = "github.com/me/my-protos;v1alpha1";
NOTE 将原型包别名为我想要引用的内容,如 Golang 中所示。go_packagev1alpha1github.com/me/my-protos
然后我生成:
MODULE="github.com/me/my-protos"
protoc \
--proto_path=. \
--go_out=./api/v1alpha1 \
--go_opt=module=${MODULE} \
--go-grpc_out=./api/v1alpha1 \
--go-grpc_opt=module=${MODULE} \
./something.proto
注意此示例也生成 gRPC 代码。它避免了(! 为生成的代码创建路径,因为我正在该存储库中生成源代码。我只想要创建文件的相对路径。protocgithub.com/me/my-protos./api/v1alpha
这会产生:
my-protos
├── something.proto
├── api
│ └── v1alpha1
│ ├── something_grpc.pb.go
│ └── something.pb.go
├── go.mod
├── go.sum
└── README.md
我可以导入:
import (
pb "github.com/me/my-protos/api/v1alpha1"
)
注意从其他存储库中,我现在可以访问我的 protos 存储库,将重现和生成的位置结合起来,以提供所需的路径。github.com/me/my-project/api/v1alpha1
- 1 回答
- 0 关注
- 145 浏览
添加回答
举报
