「急著:文件“〇〇.proto”已被登記,因此發生錯誤」的解決方法
首先
我现在参与处理涉及Go和gRPC的项目。
因此,我更新了gRPC并进行了实现,在使用Go进行测试时遇到了标题中的错误。
由于解决错误花费了一些时间,希望这对于处于类似状况的人有所帮助!
结论
在环境变量中添加 GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn 来避免错误。
GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn
发生了什么事情? ?)
当运行测试时,发生了以下错误。
panic: proto: file "〇〇.proto" is already registered
previously from: "github.com/△△/△△"
currently from: "github.com/□□/□□"
See https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict
在本次的实现中,gRPC是在另一个存储库中实现的,它被引入到Go端的存储库中。
确定原因 (determine the cause)
当查看错误消息时,说明已经注册了〇〇.proto文件。
在之前和目前的每个存储库中查看后,确认确实存在〇〇.proto文件。
然而,在 https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict 上看到了这个,所以决定去看一下。
尽管是用英语写的,但仔细一看,发现以下的描述。
在程序执行时,可以通过设置环境变量来处理执行特定Go二进制文件时的冲突行为:GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn ./main。
翻译:当程序执行时,可以通过设置环境变量来处理执行特定的Go二进制文件时的冲突。
经过调查,发现如果注册的名称相同,似乎就会发生冲突并导致恐慌错误,这似乎是规范的一部分。
https://github.com/protocolbuffers/protobuf-go/blob/b0a9446/reflect/protoregistry/registry.go#L44-L65
然而,尽管可能会出现竞争,但这不会对实施本身产生影响,因此为了避免这种panic错误,我们决定设置环境变量来进行避免。
方法,处理方法,解决办法,策略
实施这次添加环境变量的情况下,需要在Dockerfile和ci.yml文件中进行记录。
ENV GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn
- run: make test
env:
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: warn
记录下来后,进行测试后,成功地避免了错误。
WARNING: proto: file "〇〇.proto" is already registered
previously from: "github.com/△△/△△"
currently from: "github.com/□□/□□"
See https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict
总结
除了添加环境变量之外,还可以通过更改.proto文件名来解决问题。但是,由于实现的影响范围很广,所以我们决定在这次只添加环境变量的形式来解决。
如果你遇到相同的错误,希望你能参考一下。非常感谢您一直阅读到最后!
文献引用
-
- https://protobuf.dev/reference/go/faq/#fix-namespace-conflict
-
- Go:Protocol BuffersのNamespaceが競合したらpanicするのはなんで?
- https://github.com/protocolbuffers/protobuf-go/blob/b0a9446/reflect/protoregistry/registry.go#L44-L65