protoc生成govalidators校验文件时输出路径错误如何解决
protoc生成go-proto-validators校验文件出现多余嵌套目录的解决方法
问题现象
gRPC服务接入请求校验能力时,proto文件存放在pkg/test/test.proto路径,执行原编译命令后,生成的validator.go未输出到预期的pkg/test目录,反而自动创建了多层嵌套路径{source relative pkg}/pkg/test/test.proto/validator.go存放文件。
原编译命令如下:
protoc --go_out=. \ --proto_path=${GOPATH}/src \ --proto_path=${GOPATH}/src/github.com/gogo/protobuf/gogoproto/ \ --proto_path=${GOPATH}/src/github.com/mwitkow/go-proto-validators/ \ --proto_path=. \ --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative pkg/test/test.proto --govalidators_out=.
根因
- 未给
govalidators生成插件配置paths=source_relative参数。protoc各代码生成插件默认会按proto文件内声明的go_package值拼接输出目录,只有显式指定paths=source_relative,才会在输入proto文件的同级目录直接输出生成代码。原命令仅为go_out、go-grpc_out配置了该参数,遗漏了校验插件的对应配置,导致路径拼接逻辑异常。 - 原命令中
--proto_path=. \后存在多余空格,会干扰protoc的参数解析,放大路径生成异常问题。
修正方案
为govalidators插件追加paths=source_relative配置,同时清理参数间的多余空格,调整后可直接使用的编译命令如下:
protoc --go_out=. \ --proto_path=${GOPATH}/src \ --proto_path=${GOPATH}/src/github.com/gogo/protobuf/gogoproto/ \ --proto_path=${GOPATH}/src/github.com/mwitkow/go-proto-validators/ \ --proto_path=. \ --go_opt=paths=source_relative \ --go-grpc_out=. \ --go-grpc_opt=paths=source_relative \ --govalidators_out=. \ --govalidators_opt=paths=source_relative \ pkg/test/test.proto
执行后.pb.go、_grpc.pb.go、validator.go三类生成文件都会直接输出到pkg/test目录,不会产生多余嵌套层级。
内容的提问来源于stack exchange,提问作者Prems
相关产品推荐
相关产品推荐

