如何解决proto:文件已经注册到不同的包
我在不同的 go 包下编译了 2 个 proto,但是当我在服务器中注册它们并运行它时,我得到:
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 的包定义不会与来自 github.com/soft/proto-asterix/asterix 的包发生冲突。只有 .proto 文件名相似(common.proto)。
我使用以下命令生成带有 protoc 和 protoc-gen-go 插件的 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-namespace-conflict 应附加包和文件名以检查注册冲突,但此处似乎并非如此。
有没有人遇到过这种行为?我是否错过了解决此包名称冲突的明显问题?
这是我尝试过的:
- 向
package
文件添加/删除common.proto
指令 - 更改 protoc 命令以使用绝对(而非相对)
proto_path
协议版本:libprotoc 3.15.7 protoc go 插件版本:protoc-gen-go v1.26.0
解决方法
感谢@blackgreen 的建议,确实,这是https://go-review.googlesource.com/c/protobuf/+/301953/ 修复的错误
虽然 protoc-gen-go 的下一个版本已经发布,但这里有一个快速修复您的项目:
使用固定的 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
你应该很高兴!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。