「急著:文件“〇〇.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
bannerAds