You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:31:02