proto:file已在不同的包中注册



我有两个proto在不同的go包下编译,但当我在服务器中注册并运行时,我得到:

panic: proto: file "common.proto" is already registered
previously from: "github.com/soft/test-platform.go/common"
currently from:  "github.com/soft/proto-asterix/asterix"

以下是测试平台存储库中的common.proto(位于/api文件夹中(:

syntax = "proto3";
package soft.testplatform.common; // here I do defint a UNIQUE package name !
option java_multiple_files = true;
option go_package = "github.com/soft/test-platform.go/common"; // Here I do define a unique go package name !
message MyMessage{
string commandId = 1;
}

正如您所看到的,go_package

package我使用以下命令生成带有protoc的go文件protoc gen go插件:

protoc 
--proto_path=../test-platform/api/   
--go_out=./common --go_opt=paths=source_relative 
../test-platform/api/common.proto

根据此处的文档https://developers.google.com/protocol-buffers/docs/reference/go/faq#fix-命名空间冲突应该附加包和文件名以检查注册冲突,但这里的情况似乎并非如此。

有人遇到过这样的行为吗?我是否遗漏了解决此包名称冲突的明显内容?


这是我尝试过的:

  • common.proto文件添加/删除package指令
  • 将protoc命令更改为使用绝对(而非相对(proto_path

Protoc版本:libprotoc 3.15.7Protoc go插件版本:Protoc gen go v1.26.0

接受的答案不再正确。此提交还原了";错误修复";因为它不同于其他gRPC实现。

我解决这个问题的唯一方法是重命名文件/文件夹。

感谢@blackgreen的建议,事实上,这是一个由https://go-review.googlesource.com/c/protobuf/+/301953/

虽然protoc gen go的下一个版本已经发布,但这里有一个针对您项目的快速解决方案:

使用固定协议:

go install google.golang.org/protobuf/cmd/protoc-gen-go@febffdd

更改go.mod中的导入以匹配

google.golang.org/protobuf v1.26.1-0.20210525005349-febffdd88e85

你应该准备好了!

最新更新