kratos new后go mod tidy卡住主因是Go版本不匹配:项目要求Go 1.21+但go.mod声明为1.20,导致protobuf解析失败;需确认go version≥1.21、go.mod首行为go 1.21、GOROOT与which go一致。

kratos new后go mod tidy卡住,大概率是Go版本不匹配
kratos new生成的项目默认要求 Go 1.21+,但go.mod顶部声明的go 1.20没改,会导致go mod tidy在解析google.golang.org/protobuf时卡死,或报incompatible version。这不是依赖冲突,而是模块解析器拒绝加载不兼容泛型签名的包。
检查并修正三处:
- 运行
go version确认当前 shell 使用的是 ≥1.21 的 Go - 查看
go.mod首行是否为go 1.21(不是1.20) - 执行
which go和go env GOROOT,确保二者指向同一新版路径
undefined: wire.Build 报错,本质是 wire 工具和项目 Go 版本不一致
wire.Build是泛型函数,Go 1.21 才正式支持其完整语义。如果用 Go 1.20 安装了wire,再切到 Go 1.21 运行go run ./cmd/wire,就会报未定义——因为二进制里没编译出这个符号。
解决方法只有一条:用当前项目的 Go 版本重装 wire:
- 先确认
go version输出是go1.21.x - 运行
go install github.com/google/wire/cmd/wire@latest - 删掉
./wire_gen.go,再执行wire ./...
proto 生成代码与 kratos 插件版本不匹配引发 import 冲突
常见现象:api/hello/v1/hello_http.pb.go里出现import "github.com/go-kratos/kratos/v2/transport/http",但项目里实际用的是v2.8.2,而该文件却引用了v2.7.0里的内部路径,导致go build报cannot find module providing package。
根本原因是protoc-gen-go-http插件版本和kratos SDK 版本没对齐。比如:
-
kratos v2.8.2必须配protoc-gen-go-http/v2@v2.8.2 - 不能混用
v2.7.0插件 +v2.8.2SDK - 检查方式:
go list -m github.com/go-kratos/kratos和protoc-gen-go-http --version输出应一致
go.sum 中同一模块多个 hash,说明间接依赖被不同路径拉入
例如golang.org/x/net在go.sum里出现两行不同 hash,通常是因为kratos和某个中间件(如prometheus/client_golang)各自声明了不同 minor 版本。这本身不报错,但可能引发运行时行为差异。
稳妥做法是显式锁定:
- 在
go.mod中添加require golang.org/x/net v0.25.0(以 kratos v2.8.2 推荐版本为准) - 再执行
go mod tidy -e(-e忽略错误继续处理) - 最后
go mod verify确认所有校验和一致
真正麻烦的不是go.sum有多行,而是某次go get悄悄升级了google.golang.org/grpc到 v1.65+,它会把context.WithValue调用替换成context.WithoutCancel,而老版 kratos transport 没适配——这种隐性不兼容,比明面上的冲突更难定位。


















