protocol-buffers namespace conflict

在运行grpc服务,加载*.pb.go时可能会报冲突错误,如文件名命名冲突:
protocol-buffers namespace conflict_第1张图片
其实针对文件名冲突的错误处理开发者有移除过"文件冲突检测":
https://github.com/protocolbuffers/protobuf-go/commit/febffdd88e85cb4402205142aaa1a4cc64d0d375
后来发现有问题又加上了"文件冲突检测":
https://github.com/protocolbuffers/protobuf-go/commit/21e33cc91079beb975323466e237f2486ea29c10

protocol-buffers命名空间冲突的几种情况:

注意package和go_package没有必然联系,下面说的package时proto里面的package不是go的引入包
  • file冲突, 注册的时候会检查文件(即source)冲突
    图片.png
  • .不能冲突,.也不能和冲突。如package叫"A.B", 如果此时另外一个package叫"A",里面有个"B"的message,那么这个message的fullName叫做“A.B”就会和前面的package "A.B"冲突。package的名字可以相同,比如可以有两个package都叫"A"
    protocol-buffers namespace conflict_第2张图片

protocol buffer冲突检查相关的代码:

https://github.com/protocolbuffers/protobuf-go/blob/master/reflect/protoregistry/registry.go
filesByPath主要检查文件冲突, descsByName来检查各类型之间fullName有没有相互冲突
protocol-buffers namespace conflict_第3张图片
如果实在需要更改冲突处理策略,可以运行时指定命令或者配置环境变量:
protocol-buffers namespace conflict_第4张图片

参考:

你可能感兴趣的:(protocol-buffers namespace conflict)