根本原因是protoc-gen-go和protoc-gen-go-http两个插件未同时安装或版本不匹配;需用go install分别安装最新版或指定兼容版本(v2插件必须带/v2后缀),并验证$gopath/bin下两文件均存在且可被protoc调用。

Kratos项目执行 make api 报错,提示“找不到 protoc-gen-go”或“未生成 HTTP 路由代码”,根本原因不是模板写错了,而是关键插件压根没装上——protoc-gen-go 和 protoc-gen-go-http 必须同时存在且版本匹配,缺一不可。
确认 protoc 基础工具是否就位
打开终端,运行 protoc --version。如果提示 command not found,说明 protoc 二进制文件没放进 $PATH;此时需下载对应系统的 protoc-xx.x.x.zip,解压后把 bin/protoc 拷贝到 $GOPATH/bin 目录下(不是随便一个 bin)。
这一步必须成功,否则后续所有插件生成命令都会静默失败,连错误提示都不给。
安装两个核心 Go 插件
方法一:用 go install 安装最新稳定版(推荐)
执行:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest
安装完成后,检查 $GOPATH/bin 下是否存在 protoc-gen-go 和 protoc-gen-go-http 两个可执行文件。缺任何一个,make api 就只会生成 .pb.go,不会生成 _http.pb.go。
方法二:指定兼容版本(当本地 Go 是 1.21+ 但项目依赖旧版插件时)
例如:
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.33.0
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@v2.7.2
【注意:v2 插件必须带 /v2 后缀,漏掉就会装成 v1 版本,导致 HTTP 注解解析失败】
验证插件能否被 protoc 正确调用
第一步:进入项目根目录,确保 api/ 目录下有 .proto 文件(如 api/helloworld/v1/greeter.proto)
第二步:手动触发一次生成,观察输出:
protoc --go_out=. --go-grpc_out=. --go-http_out=. -I . -I third_party api/helloworld/v1/greeter.proto
第三步:检查是否生成了三个文件:
✅ greeter.pb.go(基础结构)
✅ greeter_grpc.pb.go(gRPC 接口)
✅ greeter_http.pb.go(HTTP 路由注册)
如果只生成前两个,第三个缺失,说明 protoc-gen-go-http 没被识别——大概率是文件名拼错、权限不足,或 $PATH 中混入了旧版同名二进制。
第四步:运行 which protoc-gen-go-http,确认输出路径与 $GOPATH/bin 一致。若指向 /usr/local/bin/protoc-gen-go-http,则需删掉它,避免冲突。











