生成返回自定义Proto对象的Golang gRPC客户端遇protoc命令错误
解决protoc组合plugins=grpc和M映射参数时的路径错误问题
看起来你踩了一个protoc命令参数格式的小坑——单独用plugins=grpc或者M路径映射都能正常执行,但把两者组合起来就触发了"No such file or directory"错误,这其实是参数格式的问题导致的。
问题根源
你出错的命令里,错误地用冒号分隔了plugins=grpc和M映射参数:
protoc -I.:../ --go_out=plugins=grpc:Muser/messages.proto=github.com/.../.../user:. messages.proto
protoc会把冒号后面的Muser/messages.proto=github.com/.../.../user当成输出路径的一部分,而不是参数选项,自然找不到这个不存在的"目录"。
正确的命令格式
当需要同时指定plugins=grpc和M路径映射时,这两个选项要用逗号分隔,然后再用冒号连接输出目录。修正后的命令如下:
protoc -I.:../ --go_out=plugins=grpc,Muser/messages.proto=github.com/.../.../user:. messages.proto
为什么单独的命令能正常运行?
- 单独使用
--go_out=Muser/messages.proto=github.com/.../.../user:.时,冒号前是唯一的M映射参数,冒号后是输出目录,格式符合protoc的要求 - 单独使用
--go_out=plugins=grpc:.时,冒号前是plugins参数,冒号后是输出目录,格式也正确
额外验证点
执行命令前可以再确认:
-I指定的两个包含路径(.和../)下确实存在user/messages.proto文件github.com/.../.../user是你Go项目的实际模块路径,和go.mod里的声明一致
内容的提问来源于stack exchange,提问作者user3276768
相关产品推荐
相关产品推荐

