panic: proto: file "x.proto" has a name conflict over y

1,296 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1 问题描述

因为我message.proto和group.proto都定义了ChatMsg这个结构, 在api层调用这两个rpc时, 就出现了ChatMsg 名称冲突

image.png

2 如何解决?

(1) 方法1

我发现这两个文件生成go的包名都叫proto, 所以会导致proto包下有两个ChatMsg

image.png

讲道理, 我们只需要给其中一个改一下包名, 比如group下的proto改成pbgroup

image.png

呃, 还是不行

(2) 方法2

解决这个问题的核心是解决命名冲突, 那我们只让message.proto有ChatMsg这个结构, 让group.proto去import就行了

先给message.proto加个包名, 为了避免和proto关键字冲突, 这里就叫msg image.png

再给group.proto加上包名, 并导入message image.png

然后在用到ChatMsg的地方, 都用msg.ChatMsg来代替 image.png

再用protoc重新生成一次pb.go和_grpc.pb.go

root@tencent:~/code/ws_chat # protoc --go_out=./ --go-grpc_out=./ app/group/rpc/group.proto

结果发现group.pb.go报错, image.png

这主要是proto文件的导包方式和go文件的导包方式不同, 为了导包成功, 我们需要手动加上module名在前面 . 暂时没找到更好的办法了 如果您有更好的办法, 欢迎在评论区留言