最后更新于2024年3月28日 10:57:52
简中没查到类似的文章。一点小事闹麻了,搞了一天,特意发出来造福大家。
所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3:
目的
为了适配旧代码,里面有一些默认的注册type的init函数,在version4里面是不会自动生成的:
话说回来我应该可以手动register吧?不过那样太麻烦了。
需要做什么
1、需要把github.com/golang/protobuf这个库的版本退回v1.3.5
2、需要使用相应版本的protoc工具来生成。
1. 版本回退
Revert to Earlier Version of protoc-gen-go
使用命令:
go get -u github.com/golang/protobuf@v1.3.5
修改后go.mod文件如下:
这个过程中很痛苦很折磨,go get的时候各种没响应啥的,要自己多试几次,反正目标就是把这个旧版本的protobuf库go get下来:
我试了1挂代理;2使用下面命令:
go clean -modcache
rm go.sum
go mod tidy 报错:verifying …: checksum mismatch
这其中还有个地方要注意,就是新版本的protobuf会多出一个“google.golang.org/protobuf@1.33.0”这个库。其实github.com/golang/protobuf和google.golang.org/protobuf两个库,后者是包含前者的,最直观的就是当使用了google.golang.org/protobuf的时候,github.com/golang/protobuf在goland里面会被划掉表示deprecated了。但是在我们这种version3的时间节点上,google.golang.org/protobuf应该还没开发出来呢吧……至少我没去管这个库。
2. 编译对应版本的protoc工具
一共有三个protoc工具,分别是protoc、protoc-gen-go、和protoc-gen-go-grpc。
三个工具的关系是:人工调用protoc工具即可,protoc工具会根据不知道什么路径配置,自动去调用protoc-gen-go和protoc-gen-go-grpc两个工具来生成文件
protoc-gen-go-grpc我用的版本1.2.0,protoc我电脑上有一个3.6.1版本,我就拿来用了,没有额外编译,如果需要生成的话请另外百度谷歌;
关键是protoc-gen-go这个工具,必须用旧版本才能编译出version3的proto文件来,获取工具的方法如下,参考了Need steps to download and install an older version of protoc-gen-go #1090:
先把https://github.com/golang/protobuf的官方库clone下来,根目录有个protoc-gen-go,类似这样:
放张图是因为类似名字的库太多了,tmd万一我哪天都找不到了那就搞笑了。
cd到这个protoc-gen-go目录下,然后:
git checkout 7e65e51
go build
可以./protoc-gen-go --version
,这个工具的版本太早了,甚至连获取版本号都会报错。
这样就生成这个protoc-gen-go工具了,把它放到protoc工具可以读到的路径下即可,我是放在~/go/bin目录下了。
最后生成需要的golang文件就行了,这句话没啥特别地方,大差不差,最多就是个路径的区别:
/usr/bin/protoc -I=. --go_out=. --go-grpc_out=. --proto_path=. ./*.proto