Revel学习应先掌握核心路径规则而非源码:revel.AppPath是所有路径基准,app/下controllers/views/models目录大小写与位置刚性不可变,routes是路由唯一入口,热重载仅监控app/目录。

别从源码目录开始学 Revel——你真正需要的不是看懂 revel/revel 里每个子包干啥,而是先搞清 revel.AppPath 怎么用、app/controllers/ 为什么必须大写、app/views/Home/Index.html 为什么少一个字母就 404。源码结构是结果,不是起点。
先盯死 revel.AppPath:所有路径问题的唯一解
Revel 启动时自动设好 revel.AppPath,它指向你的项目根目录(含 conf/、app/、public/ 的那个文件夹)。所有路径拼接都得基于它:
- 读配置:
revel.AppPath + "/conf/app.conf"—— 错放位置或硬写"./conf/app.conf",revel.Config直接 panic - 加载 i18n:
revel.AppPath + "/messages/home.en"—— 放错目录或命名不合规(如home.en-US少个短横),Messages.Get返回空字符串 - 静态资源路径:
revel.AppPath + "/public/css/app.css"—— 但注意:Revel 不自动 serve,得在 controller 里调c.StaticFile或配路由
别信 os.Getwd() 或 runtime.Caller,它们在 revel test、IDE 启动、二进制部署下全不可靠。
app/ 目录下三个强制目录:大小写敏感、位置刚性
app/controllers/、app/models/、app/views/ 不是建议,是编译期硬约束:
-
app/controllers/:必须有AppController,所有 controller 结构体得嵌入*revel.Controller;方法名首字母大写(Index),否则路由注册失败 -
app/views/:路径必须严格匹配控制器类名大小写,HomeController→app/views/Home/;app/views/home/或app/views/Home/index.html(小写文件名)能渲染,但app/views/home/index.html必 404 -
app/models/:虽不被框架扫描,但 Go 包路径必须合法——app/models/user.go里得写package models,且import "myapp/app/models"才有效;放错位置(如app/utils/user.go)会导致go build找不到包
routes 和 templates:唯一入口与默认约定不可绕过
Revel 没有“自动路由发现”,routes 文件是 HTTP 路由唯一声明处:
- RESTful 路由(如
GET /users)需显式写GET /users App.Users,不能只靠方法名 - 模板路径由控制器+方法名自动推导:
AppController.Index()→ 默认找app/views/App/Index.html;想换模板得调c.RenderTemplate("Other/Page"),但路径仍以app/views/为根,"../layouts/main"会 panic -
layouts/和partials/是纯约定目录,Revel 不识别其语义——{{template "layouts/main.html" .}}能工作,只因路径拼对了,不是框架特供功能
热重载只认 app/,其他改动要手动干预
Revel 开发服务器监听整个 app/ 目录树(含 app/views/ 下所有子目录),改 app/views/layouts/main.html 刷新即生效;但以下情况不会触发重载:
- 改
conf/app.conf:必须 Ctrl+C 再revel run - 改
public/css/app.css:浏览器需手动刷新,Revel 不管静态资源变更 - 改
app/services/或app/repositories/(你手动加的目录):不在监听范围内,得自己重启
最容易被忽略的是:目录名大小写错误和 app/views/ 的绝对权威性——它不像 Gin 或 Echo 允许配置视图根路径,这里没商量余地,错一个字母就是 404,且错误日志里往往不提示具体哪条路径没找到。


















