revel new 命令可直接生成可运行骨架项目,体现“约定优于配置”:需用 -a 指定小写应用名、-r 自动启动,默认监听 0.0.0.0:9000;生产环境须禁用热重载、绑定 127.0.0.1 并经 Nginx 反代,且必须透传 X-Forwarded-Proto 头以防 Session 失效。

revel new命令能直接生成可运行的骨架项目,无需手动配路由、模板或静态资源路径——这是 Revel “约定优于配置”最实在的体现。
用 revel new 创建项目时必须指定应用名和运行标志
执行命令前确保 revel CLI 已安装且在 $PATH 中(验证:运行 revel version 应输出类似 Revel Framework v1.1.0)。创建项目最简命令是:
revel new -a myapp -r
其中:
-
-a myapp:必须提供应用名,会生成同名目录,且该名将作为 Go 包路径的一部分(如import "myapp/app") -
-r:表示创建后立即run,省去后续手动启动步骤 - 不加
-r时,项目生成但不会启动;加了则自动监听:9000并打开浏览器
常见错误:revel new myapp(漏掉 -a)会报错 flag provided but not defined: -myapp;revel new -a MyApp(含大写)会导致 Go 编译失败,因包名不合法。
revel run 启动时默认绑定 0.0.0.0:9000,开发阶段够用但生产必须改
刚生成的项目运行后,访问 http://localhost:9000 看到 It works! 就算成功。但要注意:
- 开发模式下
revel run默认监听所有接口(0.0.0.0:9000),若本地有防火墙或共享网络,可能被扫描到 - 生产部署严禁直接暴露此端口,必须通过 Nginx 反向代理,并改用
-addr 127.0.0.1 -p 8089启动 - 热重载只在开发模式生效;设环境变量
REVEL_RUNMODE=prod后,revel run会禁用重载并跳过模板编译检查
示例安全启动命令:REVEL_RUNMODE=prod revel run -a myapp -addr 127.0.0.1 -p 8089
项目结构里 app/controllers 和 app/views 是你真正要动的两个目录
Revel 强制约定目录结构,不需要配置就能识别控制器和模板。典型路径对应关系如下:
- 访问
/hello→ 自动调用app/controllers/App.go中的App.Hello()方法 - 该方法返回
c.Render()→ 自动渲染app/views/App/Hello.html -
app/views/layout.html是全局布局,用{{yield}}插入具体页面内容
容易踩的坑:
- 控制器方法名首字母必须大写(Go 导出规则),否则
revel扫描不到 - 模板文件名必须和控制器方法名完全匹配(大小写敏感),
Hello.html对应Hello(),不是hello.html - 修改
routes文件无用——Revel 路由由控制器方法签名自动生成,除非你主动写conf/routes覆盖
Nginx 反向代理配置里 X-Forwarded-Proto 漏传会导致 Session 失效
当你把 Revel 应用放到 Nginx 后面跑 HTTPS 时,revel.Session().Get() 可能始终返回空值。根本原因不是 Cookie 丢失,而是 Revel 认为当前请求是 HTTP,拒绝复用加密的 Session Cookie。
必须在 Nginx 配置中显式传递协议头:
proxy_set_header X-Forwarded-Proto $scheme;
否则即使 Nginx 正确转发了请求,Revel 内部仍按 HTTP 协议生成 Cookie 标志(Secure 属性被忽略),导致浏览器不发送该 Cookie。
这个细节在本地开发时完全不会暴露,只有上生产、启 HTTPS 后才突然崩——最容易被忽略。











