0

我有一个生成 C# 和 Go 代码的 protobuf。

protobuf 包含:

syntax = "proto3";
package myprotobuf;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git";

我正在为我的 Go GRPC 使用go-microprotoc-gen-micro。我正在为我的 Go 包使用Go 模块。我将生成的 Go 代码推送到我的 protobuf 存储库有几个原因:(a) 使用 Git 子模块可能会很痛苦 (b) 引用外部包中的类型的 protobuf 要求外部包具有定义的绝对包 URL (c) 这就是谷歌的做法(例如structpb),所以这似乎是“标准”。

从该原型生成的 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似乎需要 .git 在包 URL 的末尾。
  • go modules 需要 "module" 和 "package" 定义来匹配 URL。
  • C# 不喜欢“。” 在命名空间中。

因此,似乎 Go 和 C# 总是会在端点前面加上认为的包/命名空间是什么,并且他们永远不会就包/命名空间应该是什么达成一致。

有没有办法覆盖以 GRPC 端点为前缀的命名空间?

4

1 回答 1

0

我发现的一种解决方法是将包放在“mypb”目录中protos下的一个级别:

package mypb;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git/mypb";
option csharp_namespace = "MyCompany.Protobuf.MyPB";

这有点像 hack,但我不太介意,特别是因为它使生成的代码远离了我真正关心的原始源代码。这样,生成的 C# 和 Go 就它们作为端点前缀的命名空间/包达成一致。谢天谢地,骆驼大写MyPB与小写mypb似乎无关紧要。

于 2019-03-24T23:52:05.963 回答