kratos run 是开发态快捷命令,用于自动触发 wire 生成依赖图并加载配置;不能直接 go run main.go 是因为 main.go 仅调用 wire.Build,真正初始化逻辑在 wire_gen.go 中,跳过会导致依赖未注入而 panic。

直接用 go build 就能打包,但 Kratos 项目默认不靠它启动——因为要注入依赖、加载配置、初始化中间件,这些都得走 kratos run 或生成的 wire_gen.go 流程。
kratos run 是什么,为什么不能直接 go run main.go
Kratos 的 main.go 不是传统 Go 程序入口:它只调用 wire.Build(...),真正启动逻辑在 wire_gen.go 里生成。这个文件由 wire 工具根据 wire.go 中的 Provider 链自动构造,把 conf、data、service 等层的依赖串起来。
如果你跳过 wire 直接 go run cmd/server/main.go,会 panic 报错:panic: interface conversion: interface {} is nil, not *service.GreeterService——因为没注入任何实例。
-
kratos run本质是go run .+ 自动触发wire生成(若wire_gen.go不存在或过期) - 它还会自动加载
configs/config.yaml,并支持热重载(加-w参数) - 生产环境不要用
kratos run,它只是开发态快捷命令
正式打包:go build + wire_gen.go 必须存在
打包前必须确保 cmd/server/wire_gen.go 已生成且最新,否则编译会失败或运行时 panic。Kratos 不在 go build 过程中自动调用 wire,这步得你手动做。
- 首次生成或 proto/依赖变更后,执行:
wire ./cmd/server - 如果提示
command not found: wire,先安装:go install github.com/google/wire/cmd/wire@latest - 确认生成成功:
ls -l cmd/server/wire_gen.go应有时间戳更新 - 然后才能安全执行:
go build -o bin/server ./cmd/server
生成的二进制 bin/server 是纯静态可执行文件(Go 默认),不含源码或配置,启动时需显式指定配置路径:./bin/server -conf configs/config.yaml。
Makefile 和 Docker 打包常见踩坑点
Kratos 官方模板自带 Makefile,但它的 make build 实际调的是 go build,并不保证 wire_gen.go 新鲜——这是最常被忽略的点。
- 别信
make build能自动刷新依赖图;每次改了data层构造函数或新增biz服务,必须先wire ./cmd/server - Docker 构建时,
go build在容器内执行,wire工具默认不在基础镜像里;要么多装一步:RUN go install github.com/google/wire/cmd/wire@latest,要么在宿主机生成wire_gen.go后再 COPY 进去 -
go build -ldflags="-s -w"可减小体积,但 Kratos 日志、链路追踪等调试信息会丢失,上线前慎用
Wire 生成的依赖图是一次性快照,不是运行时反射;改了代码却不重跑 wire,编译能过,但 runtime 注入失败——这个静默错误比编译报错更难排查。











