Revel 项目必须严格遵循 app/ 下的 MVC 目录约定,所有业务代码须置于 app/ 子目录内,否则框架无法自动加载、热重载失效、路由注册失败;app/init.go 是唯一全局初始化入口,需显式导入各子包;public/ 是唯一静态资源托管目录,conf/、tests/、messages/ 位置不可更改。

Revel 项目必须严格遵循 app/ 下的 MVC 目录约定
Revel 不支持自定义控制器或模型路径,所有业务代码必须放在 app/ 子目录内,否则框架无法自动加载、热重载失效、路由注册失败。这不是可选项,是运行时硬约束。
典型结构中:app/controllers/ 放处理 HTTP 请求的 struct 和 Action 方法;app/models/ 放数据结构和数据库操作逻辑(如 model.go);app/views/ 存放模板文件,且路径需与控制器命名严格对应(例如 app/controllers/App.go 的 Index 方法默认渲染 app/views/App/Index.html)。
- 不要在
app/外新建pkg/或internal/存业务逻辑——Revel 不扫描这些目录,init 函数不会被触发 -
app/init.go是唯一全局初始化入口,所有控制器、模型、拦截器都靠它显式导入;多个 init 文件不保证执行顺序 - 若用 Go Modules,
go mod init的模块名仅作导入标识,不影响 Revel 对app/的路径解析
如何组织跨模块复用的代码
Revel 没有原生“模块”概念,所谓“模块化”实际是靠 Go 包级隔离 + 命名空间模拟。常见做法是在 app/ 内按业务域建子包,但必须确保它们仍属于 Revel 可识别的加载范围。
例如用户中心模块:可建 app/models/user/ 和 app/controllers/user/,但需在 app/init.go 中显式导入 _ "myapp/app/models/user" 和 _ "myapp/app/controllers/user",否则这些包的 init() 不会执行,数据库注册、路由绑定都会漏掉。
- 避免在
app/models/下直接放大量 .go 文件——难以维护,建议按领域拆包(如user/、order/、payment/) - 共用工具函数不要塞进
app/utils/——Revel 不加载该路径;应放在app/models/common/或提升到项目根目录的internal/(需手动 import) - 拦截器(interceptor)必须注册到
app/controllers/init.go,且顺序敏感——先注册的先执行,后注册的后执行
静态资源与前端代码怎么安放才不踩坑
Revel 的 public/ 是唯一被 Web Server 自动托管的静态目录,任何放在里面的文件(CSS、JS、图片)都会通过 /public/xxx 路径直接可访问。但它不参与 Go 编译,也不受热重载监视。
因此,前端工程化构建产物(如 Vite 打包后的 dist/)不能直接扔进 public/,而应输出到 public/js/、public/css/ 等子目录,并在模板中用固定路径引用(如 <script src="/public/js/main.js"></script>)。否则开发时修改源码,Revel 不会触发刷新,浏览器缓存还可能让你以为代码没生效。
- SCSS/Less 等预处理器文件别放
public/——Revel 不编译它们;应放在项目根目录styles/或assets/,用 Grunt/Webpack 构建后输出到public/css/ - React/Vue 前端代码建议完全独立于
app/,用单独的frontend/目录管理,构建后只把index.html和静态资源同步进public/ -
public/images/下的图片路径在模板中要写成/public/images/logo.png,不是../images/logo.png——Revel 不做相对路径解析
测试、配置、国际化目录不能乱动
conf/、tests/、messages/ 这三个目录的位置是 Revel 启动时硬编码识别的,移动或重命名会导致应用启动失败或功能异常。
conf/app.conf 是主配置,环境变量覆盖规则为:命令行参数 > app.conf 中 [dev] 或 [prod] 区块 > 默认区块;conf/routes 是纯文本路由表,每行格式为 GET /users App.Users,空格和大小写敏感;messages/ 下的 en-US.conf 等文件用于 i18n,key 必须全小写加下划线(如 user_login_success),否则 messages.Render 查不到。
-
tests/下的测试文件必须以*_test.go结尾,且包名保持为tests,否则revel test找不到测试用例 - 新增配置项不要直接写死在
app.conf,应加到[dev]和[prod]区块里,避免本地调试和部署行为不一致 -
messages/文件编码必须是 UTF-8 无 BOM,Windows 记事本保存极易引入 BOM 导致解析失败,报错信息为invalid character '\ufeff' looking for beginning of value
Revel 的目录规划难点不在“能怎么分”,而在“哪些位置绝对不能动”。一旦偏离约定,问题往往表现为静默失败——比如控制器方法不响应、模板找不到、配置不生效,而不是明确报错。最稳妥的做法是:首次生成项目后,立刻用 revel new 创建一个干净副本,把它的目录结构当基准,每次新增内容前先对照确认路径是否在 Revel 的扫描白名单内。











