我正在尝试使用这里描述的六角形体系结构来完成Go项目。在我的项目中,我使用从gRPC文件用protoc生成的protoc通信。
目录结构:
|- grpc.proto
|-internal
|-core
|-domain
|-services
|- grpcprotocol而且,我的grpc.proto文件有指向Go项目中特定目录的go_package选项。
syntax = "proto3";
option go_package = "github.com/myuser/myrepo/internal/core/services/grpcprotocol";
...使用grpc_grpc.pb.go,我可以在内部/核心/域目录中生成grpc.pb.go文件,在内部/core/services/grpcprotocol目录中生成文件。
但是,grpc.pb.go有一个名为grpcprotocol的go包,而它应该有一个名为domain的包(我还使用在单独的Go文件中定义的其他类型)。另外,grpc_grpc.pb.go文件的代码使用在grpc.pb.go中定义的类型,而不需要导入(它把它当作是在同一个包中定义的)。
是否有可能将这两个文件分割成单独的Go包,并强制grpc_grpc.pb.go中的代码从域目录导入类型,而不是按照在同一个包中定义的那样对待它们?
发布于 2022-04-21 00:01:50
这里最好的解决方案是将grpcprotocol中想要的代码和想要放入domain中的代码分离到单独的文件中。例如:
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";,如果domain.proto和grpc.proto不在同一目录中,则提供--proto_path。最后,要在domain.proto中引用grpc.proto中的对象,可以编写:
domain.AnObject之后,您可以利用--go_opt=module和--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这将做的是,它将从每个go_package中删除go_package,并且基本上从模块的根开始。这就是为什么你可以做一个--go_out=.和--go-grpc_out=.。
希望这能有所帮助,让我知道如何才能进一步完善我的答案。
备注
go_package并不相同。前者仅用于提供上下文,并扩展了限定名。在go代码生成过程中使用go_package。package是可选的,它使事情变得更清楚,没有人可以在不指定完全限定名的情况下误用proto文件(如果命名正确,则稍微安全一些)。https://stackoverflow.com/questions/71944360
复制相似问题