我只有一个protobuf,可以生成C#和Go代码。
protobuf包含:
syntax = "proto3";
package myprotobuf;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git";
我将go-micro和protoc-gen-micro用于Go GRPC。我的Go软件包使用的是Go modules。我将生成的Go代码推送到protobuf存储库的原因有几个:(a)使用Git子模块可能很麻烦(b)引用外部包中的类型的protobuf要求外部包具有已定义的绝对包URL (c)这就是Google的做法(例如,structpb),因此这似乎是“标准”。
由此proto生成的C#服务器/客户端为“ /myprotobuf.Service/Method”提供服务/命中了一个端点,并且运行正常。
C#的GRPC_TRACE给出:
Decode: ':path: /myprotobuf.Service/Method', elem_interned=1 [1], k_interned=1, v_interned=1 (edited)
调用C#服务器的Go / go-micro客户端提供:
Decode: ':path: /myprotobuf.git.Service/Method', elem_interned=0 [2], k_interned=1, v_interned=0
其后是一个错误。请注意,路径是不同的。 C#GRPC处理程序中的断点和Console.WriteLine永远不会被命中,这是有道理的,因为我们没有命中已知的端点。
对此有什么解决方案?
go get
似乎在包URL的末尾需要.git。因此,似乎Go和C#都总是在端点之前加上软件包/名称空间的含义,而他们永远也不会就软件包/名称空间的含义达成共识。
是否有办法覆盖以GRPC终结点为前缀的名称空间?
答案 0 :(得分:0)
我发现的一种解决方法是将程序包放置在“ mypb”目录中的protos下的某个位置:
package mypb;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git/mypb";
option csharp_namespace = "MyCompany.Protobuf.MyPB";
这有点骇人听闻,但我不太介意,特别是因为它会将生成的代码置于我真正关心的原始源代码之外。这样,生成的C#和Go在它们使用终结点作为前缀的名称空间/包上达成一致。幸运的是,驼色MyPB
与小写mypb
似乎无关紧要。