导入Nighthawk项目proto报File not found错,如何生成Go gRPC客户端代码
问题原因
protoc执行时默认仅扫描当前工作目录及系统默认路径下的proto文件,你没有手动指定依赖proto所在的搜索路径,导致import的公共依赖文件无法被识别。
解决步骤
- 提前下载所有依赖的proto源码到本地:
- Envoy仓库源码:确保你已将Envoy仓库克隆到本地,其中
api目录下包含所有报错中缺失的envoy/*路径的proto文件 - Validate校验proto源码:获取对应
validate/validate.proto文件
建议统一将所有第三方依赖存放到项目根目录的third_party文件夹下,方便路径管理。
- 执行protoc时通过
-I(即--proto_path)参数添加所有需要扫描的proto搜索路径,示例命令如下(路径请根据你本地实际存放位置调整):
protoc \ -I . \ -I ./third_party/envoy/api \ -I ./third_party/validate/proto \ --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ api/client/output.proto
补充说明
- 你没有遗漏其他配置,仅需要确保所有import路径对应的父目录都被加入到protoc的搜索路径中即可。如果后续还出现其他找不到文件的报错,只需将对应依赖的proto父目录追加
-I参数即可。 - 路径匹配规则:比如import声明为
envoy/config/core/v3/base.proto,你添加的-I指定的目录下必须能直接找到envoy/config/core/v3/base.proto这个路径,根据你本地存放依赖的位置调整-I的参数值即可。 - 可选简化方案:你也可以使用buf工具来管理proto依赖,无需手动克隆第三方仓库,配置好依赖声明文件后直接执行生成命令即可生成代码。
内容的提问来源于stack exchange,提问作者Navendu Pottekkat
相关产品推荐
相关产品推荐

