revel version 显示 v0.24 是因 CLI 与框架分离发布,v0.24 为旧版 CLI,不兼容 v1.1.0 框架;需执行 go install github.com/revel/cmd/revel@latest 升级 CLI 至 ≥v0.25,并确认 go list -m github.com/revel/revel 输出 v1.1.0。

revel version 命令为什么显示 v0.24 而不是 v1.1.0
CLI 工具和框架核心是分离发布的,revel version 显示的是 CLI 版本,不是框架版本。你看到 v0.24,说明本地安装的仍是旧版 CLI,它无法识别 go.mod 中的 github.com/revel/revel v1.1.0,导致后续 revel run 报 “not found in GOPATH” 或路由 404。
验证方式:在项目根目录下执行 revel run .(注意显式传参 .),若报错 cannot find package "github.com/revel/revel",就是 CLI 和框架版本不匹配。
- 升级 CLI:运行
go install github.com/revel/cmd/revel@latest(不是@v1.1.0) - 确认生效:执行
revel version,输出应为v0.25或更高 - 再检查框架版本:在项目中运行
go list -m github.com/revel/revel,结果必须是v1.1.0
GO111MODULE=off 导致 revel run 静默失败
Revel v1.1.0 强制依赖 Go Modules,若 GO111MODULE=off,revel run 会跳过 go.mod 解析逻辑,直接尝试在 $GOPATH/src 下找包,找不到就静默退出或误判路径——你可能只看到空白终端、无错误、无监听日志,但服务根本没起来。
执行 go env GO111MODULE,输出必须是 on 或空字符串(Go 1.16+ 默认 on)。若为 off,立刻运行:
go env -w GO111MODULE=on- 检查项目根目录是否存在
go.mod;若无,手动执行go mod init github.com/yourname/your-app - 运行
go mod tidy确保github.com/revel/revel v1.1.0已拉取
revel run 启动后访问 404 的真实原因
不是路由没写,也不是端口错,而是 v1.1.0 移除了 routes.conf 自动加载机制,所有路由必须显式注册到 app/init.go 中。如果你沿用旧项目结构,revel run 成功启动、控制台显示监听日志,但所有请求都返回 404,大概率是这里漏了。
打开 app/init.go,确认是否调用了 revel.Router.AddRoute 或 revel.InterceptFunc 注册控制器方法;末尾是否写了 revel.Run()。常见错误包括:
- 忘记把旧
conf/routes内容迁移到init.go,只留了个空文件 - 注册语句写在
revel.Run()之后,导致未生效 - 用
revel.BEFORE拦截器注册了路由,但没在init()函数里调用revel.InterceptFunc
健康检查接口 /health 返回 404 或被 Filter 拦截
新项目默认没有 /health 路由,且即使你手动加了,也会被 JWTFilter、LogFilter 等中间件拦截,导致 Kubernetes livenessProbe 失败重启。这不是配置问题,是 Revel 的 Filter 链默认对所有路由生效。
正确做法是让 GET /health 完全绕过 Filter 链:
- 在
app/filter.go中,把revel.Router.AddRoute("GET", "/health", (*HealthController).Get)这行放在所有revel.Intercept()和revel.FILTERS = append(...)之前 - 确保
HealthController只嵌入*revel.Controller,不带任何Before()或After()方法 - 不要在
app.conf中开启revel.BConfig.WebConfig.DisableStatic = false,否则静态文件中间件可能干扰路径匹配
最易忽略的是:HealthController 必须定义在 app/controllers/health.go,且结构体名首字母大写(如 type HealthController struct),否则 revel run 不会加载它。











