如何在自定义Proto文件中导入Vendor目录下的外部Proto文件?
你遇到的这个问题很典型——protoc默认不会自动去vendor目录搜索依赖的proto文件,所以才会抛出File not found的错误。下面给你几个实用的解决办法:
1. 把Vendor目录加入Protoc的搜索路径
这是最直接也最推荐的方案,你只需要在编译命令里额外添加-I vendor参数,让protoc知道要去vendor目录里查找导入的文件。修改后的完整编译命令如下:
protoc -I api -I vendor api/command.proto --go_out=plugins=grpc:api
这里的-I(等价于--proto_path)用来指定protoc查找proto文件的根目录,添加-I vendor后,protoc就会去vendor目录下匹配你导入的github.com/service/command.proto路径,只要vendor里确实存在vendor/github.com/service/command.proto这个文件,就能成功找到。
2. 确认Vendor目录的文件结构正确
先检查一下项目目录里的文件结构,确保vendor/github.com/service/command.proto这个路径是真实存在的。如果vendor里的依赖文件结构不对(比如少了某一层目录),就算加了-I vendor也会报错,这时候可以用go mod vendor命令重新生成正确的vendor目录结构。
3. 可选:改用相对路径导入(不推荐)
如果你暂时不想修改编译命令,也可以把proto里的导入路径改成相对路径,比如:
import "../vendor/github.com/service/command.proto";
但这种方式不够灵活,一旦你的proto文件位置变动,相对路径也得跟着修改,所以还是更推荐第一种添加搜索路径的方案。
另外小提醒:确保你的protoc版本和grpc-go插件版本是兼容的,避免因为版本不匹配出现其他奇怪的错误。
内容的提问来源于stack exchange,提问作者Cae Vecchi

