为了账号安全,请及时绑定邮箱和手机立即绑定

带有 grpc 的 protobuf for Go 在拆分包中

带有 grpc 的 protobuf for Go 在拆分包中

Go
函数式编程 2022-12-05 16:30:13
我正在尝试使用此处所述的六边形架构来制作我的 Go 项目。在我的项目中,我使用的是protoc从.proto文件生成的 gRPC 通信。目录结构:|- grpc.proto|-internal  |-core    |-domain  |-services    |- grpcprotocol我的grpc.proto文件有 go_package 选项,它指向我的 Go 项目中的特定目录syntax = "proto3";option go_package = "github.com/myuser/myrepo/internal/core/services/grpcprotocol";...使用protoc --go_out=internal/core/domain --go_opt=paths=source_relative --go-grpc_out=internal/core/services/grpcprotocol --go-grpc_opt=paths=source_relative ports.proto我能够在internal/core/domain目录中生成grpc.pb.go文件,在internal /core/services/grpcprotocol目录中生成grpc_grpc.pb.go文件。但是,grpc.pb.go有一个名为 go 的包grpcprotocol,而它应该有一个名为的包domain(我还使用在单独的 Go 文件中定义的其他类型)。grpc_grpc.pb.go文件也有代码使用 grpc.pb.go 中定义的类型而不导入(它把它当作是在同一个包中定义的)。是否可以将这两个文件拆分为单独的 Go 包并强制执行grpc_grpc.pb.go中的代码以从域目录导入类型,而不是将它们视为在同一包中定义的类型?
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

你最好的解决方案是将你想要的代码和你想要的代码分开grpcprotocol到domain单独的文件中。如:


域.proto

syntax = "proto3";

package domain;

option go_package = "github.com/myuser/myrepo/internal/core/domain";


//...

grpc.proto

syntax = "proto3";

package grpcprotocol;

option go_package = "github.com/myuser/myrepo/internal/core/services/grpcprotocol";


//...

然后你可以导入你domain.proto的grpc.proto,通过简单地写import "domain.proto";,提供一个--proto_pathifdomain.proto并且grpc.proto不在同一个目录中。最后,要从domain.proto中引用一个对象,grpc.proto您可以这样写:


domain.AnObject

之后,您可以利用--go_opt=moduleand--go-grpc_opt=module去除模块名称go_package并在正确的位置生成代码。喜欢:


protoc --go_out=. --go_opt=module=github.com/myuser/myrepo --go-grpc_out=. --go-grpc_opt=module=github.com/myuser/myrepo *.proto

这将做的是,它将github.com/myuser/myrepo从每个中删除go_package并基本上从模块的根开始。这就是为什么你可以做一个--go_out=.and --go-grpc_out=.。


希望有帮助,让我知道如何进一步改进我的答案。

笔记

  • 和protobuf的封装go_package是不一样的。前者仅用于 protobuf 以提供上下文,它扩展了限定名称。在go_packagego 代码生成期间使用。

  • proto 文件中的package是可选的,它使事情更清楚,没有人可以在不指定完全限定名称的情况下滥用您的 proto 文件(如果命名正确,会更安全一些)。


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信