revel 通过 revel_runmode 环境变量(值为 dev/test/prod)统一控制运行时行为,影响模板热重载、日志级别、错误页面等;其唯一多环境配置文件 conf/app.conf 按 runmode 分段(如 [dev]、[prod]),段名须严格匹配变量值,且配置仅在对应模式下生效。

Revel 的 RUNMODE 决定环境行为
Revel 没有像 Spring Boot 那样区分 application-dev.yml 或 application-prod.yml 的多配置文件机制。它只靠一个核心变量 REVEL_RUNMODE 控制运行时行为,值为 dev、test 或 prod。这个变量直接影响模板热重载、错误页面展示、日志级别、静态资源处理等关键路径。
如何设置 REVEL_RUNMODE(命令行与环境变量)
最直接的方式是启动时通过环境变量指定:
-
REVEL_RUNMODE=prod revel run -a myapp -p 8089 -addr 127.0.0.1—— 强制生产模式 -
REVEL_RUNMODE=dev revel run -a myapp—— 显式启用开发模式(即使没设也会默认 fallback 到 dev) - 在 Linux/macOS 中可写入
.env文件并用source .env加载;Windows 命令行用set REVEL_RUNMODE=prod
注意:revel run 默认就是 dev 模式,但一旦你用 systemd / supervisord 托管进程,必须显式设置 REVEL_RUNMODE=prod,否则会暴露调试信息、禁用缓存、开启模板自动重编译——这些在生产中都是安全隐患。
conf/app.conf 是唯一可配置的多环境文件
Revel 允许你在 conf/app.conf 中按 RUNMODE 分段写配置,语法类似 INI:
[dev] http.port=9000 log.level=DEBUG template.refresh=true [prod] http.port=8089 log.level=INFO template.refresh=false cookie.secure=true cookie.httpOnly=true
关键点:
- 段名必须严格匹配
REVEL_RUNMODE的值(如[prod]对应REVEL_RUNMODE=prod) - 未匹配段落的配置会被忽略;未声明的键会 fallback 到
[default]段(可选) -
conf/app.conf不支持嵌套或变量引用,所有值都是纯字符串,需要手动转类型(如端口号要写成8089而非"8089")
常见陷阱:conf/app.conf 不生效的三个原因
配置写对了却没起作用?大概率是以下之一:
-
REVEL_RUNMODE拼错或大小写不一致(比如写成PROD或production),Revel 只认小写dev/test/prod - 项目根目录下没有
conf/app.conf,或路径不对(Revel 固定从当前工作目录向上找conf/子目录) - 使用 Go Modules 时,
revel run启动位置不在模块根目录,导致找不到conf/—— 必须 cd 进项目根目录再执行命令
真正复杂的地方在于:Revel 的环境切换不是“加载不同配置”,而是“根据同一个变量触发不同分支逻辑”。这意味着你不能靠改配置绕过代码里硬编码的 dev-only 行为(比如 if revel.RunMode == "dev" { ... }),必须同步检查 app/init.go 和控制器中的条件判断。











