新版本protoc-gen-go丢失已知类型前缀,如何恢复原有生成逻辑?
解决protoc-gen-go升级后丢失导入类型包前缀的问题
这事儿我碰到过!新版本的protoc-gen-go(也就是基于google.golang.org/protobuf模块的官方新版)默认做了个优化:当导入的proto类型对应的Go包和当前生成代码的包关联明确时,会自动生成本地类型别名,所以你看到b.pb.go里直接用*AMsg代替了原来的*a.AMsg。要恢复旧版的生成逻辑,试试下面几个方法:
方法1:用--go_opt=M参数强制指定导入映射
在执行protoc生成命令时,通过M参数明确指定a.proto对应的Go包路径,这样工具就会保留包前缀引用。比如你的a包的Go模块路径是your/project/module/a,命令应该写成:
protoc --go_out=. --go_opt=Ma.proto=your/project/module/a b.proto
如果是本地相对路径的话,也可以写成--go_opt=Ma.proto=./a,根据你的实际项目结构调整就行。
方法2:在proto文件中添加go_package选项
给两个proto文件都加上明确的go_package配置,让工具清楚每个proto对应的Go包:
修改a.proto:
syntax = "proto3"; package a; option go_package = "./a"; // 或者你的模块完整路径,比如"example.com/yourproj/a" message AMsg{ fixed64 smth1 = 1; fixed64 smth2 = 2; }
修改b.proto:
syntax = "proto3"; package b; option go_package = "./b"; import "a.proto"; message BMsg { a.AMsg msg1 = 1; a.AMsg msg2 = 2; }
重新生成代码后,b.pb.go里就会恢复*a.AMsg的写法了。
方法3:临时回退到旧版protoc-gen-go(不推荐长期用)
如果只是应急需要旧版的生成逻辑,可以安装旧版的工具:
go install github.com/golang/protobuf/protoc-gen-go@v1.5.2
这个版本是旧版官方工具的最后几个稳定版,生成逻辑和你之前的一致,但毕竟是旧版,长期用可能会错过新特性和修复,所以优先推荐前两个方法。
内容的提问来源于stack exchange,提问作者bobra
相关产品推荐
相关产品推荐

