运行protoc编译proto文件提示validators.proto不存在问题咨询
问题根因
- 命令存在低级语法错误:你两次执行的protoc命令里,指定x库路径的参数都写的是
${GOPATH}pkg/mod/github.com/x,缺了${GOPATH}和pkg之间的斜杠,导致系统无法识别到正确的依赖路径。 - Go mod大小写转义导致路径不匹配:由于Go模块为了兼容大小写不敏感的文件系统,会将路径中的大写字母转换为
!+小写字母的格式,你导入的customValidation在本地实际存储为custom!validation,protoc按照导入路径查找时无法匹配到实际目录。 - 如果你在Windows环境下执行命令,还要注意反斜杠路径分隔符的兼容性问题,protoc默认优先识别正斜杠作为路径分隔符。
修复方案
- 先修正路径语法错误:将所有
${GOPATH}pkg/mod替换为${GOPATH}/pkg/mod,执行echo ${GOPATH}确认环境变量取值正常。 - 处理大小写转义路径不匹配的问题,可任选以下一种方案:
- 方案1:新增单独的proto_path指向转义后的目录,在protoc参数中添加
--proto_path=${GOPATH}/pkg/mod/github.com/x/custom!validation@v0.0.0-20210817213416-5eb0b8804c6f,同时将test.proto中的import语句修改为import "validators.proto",适合个人本地调试场景。 - 方案2:在
${GOPATH}/pkg/mod/github.com/x/目录下创建软链接,将custom!validation@v0.0.0-20210817213416-5eb0b8804c6f链接为customValidation,不需要修改proto代码,适配性更强。 - 方案3:使用protoc的import-mapping参数添加映射,无需修改本地文件结构和proto代码。
- 方案1:新增单独的proto_path指向转义后的目录,在protoc参数中添加
修正后命令示例(以方案3为例)
protoc \ --proto_path=${GOPATH}/src \ --proto_path=${GOPATH}/pkg/mod/github.com/gogo/protobuf@v1.3.2 \ --proto_path=${GOPATH}/pkg/mod/github.com/envoyproxy/protoc-gen-validate@v0.1.0 \ --proto_path=${GOPATH}/pkg/mod/github.com/x \ --import-mapping=github.com/x/customValidation/validators.proto=${GOPATH}/pkg/mod/github.com/x/custom!validation@v0.0.0-20210817213416-5eb0b8804c6f/validators.proto \ --proto_path=. \ --gogo_out=. \ --govalidators_out=gogoimport=true:. \ --go_out="plugins=grpc:./generated" \ --validate_out="lang=go:./generated" \ ./interfaces/test_server/*.proto
内容的提问来源于stack exchange,提问作者Maana
相关产品推荐
相关产品推荐

