Revel 的 runmode 由环境变量 REVEL_RUNMODE 控制,命令行参数如 revel run myapp prod 中的 prod 不生效;必须显式设置 REVEL_RUNMODE=prod 才能加载 conf/app.conf 中的 [prod] 段。

revel run 时指定 runmode 参数不生效?
直接执行 revel run myapp prod 不会自动加载 conf/app.conf 中的 [prod] 段,因为 Revel 的 runmode 是由环境变量 REVEL_RUNMODE 控制的,命令行参数仅用于设置端口或地址,不接管配置段切换。
-
revel run myapp dev 9000中的dev只是启动时传给 Revel CLI 的标识,实际配置加载仍取决于REVEL_RUNMODE值 - 若未显式设置该变量,Revel 默认使用
dev模式,哪怕你写了prod作为第二个参数 - 验证方式:在控制器中打印
revel.RunMode,你会发现它始终是dev
正确设置 REVEL_RUNMODE 环境变量
必须在运行前导出环境变量,且需确保它在子进程中可见。不同场景下写法略有差异:
- Linux/macOS 终端:
REVEL_RUNMODE=prod revel run myapp(注意等号无空格) - Windows cmd:
set REVEL_RUNMODE=prod && revel run myapp - IDE(如 Goland):在 Run Configuration → Environment variables 中添加
REVEL_RUNMODE=prod - Docker 或 systemd:在容器启动命令或 service 文件中通过
Environment=REVEL_RUNMODE=prod设置
conf/app.conf 中的配置段结构必须规范
Revel 要求配置段严格按 [dev]、[prod]、[test] 等命名,且不能嵌套或加空格。常见错误包括:
- 写成
[production]或[PROD]—— Revel 不识别,会回退到[dev] - 段落间缺少空行,导致解析中断,后续配置被忽略
- 在
[prod]段里漏写关键项(如http.port、db.url),Revel 不会报错,但会沿用[dev]的值 - 注释符
#后不能有空格再跟内容,否则整行被跳过(如# db.url = ...会被忽略)
生产部署时绕过 revel run,改用二进制直启
在服务器上部署时,revel run 仅限开发。应构建二进制并用环境变量启动:
- 先构建:
revel build myapp prod,生成myapp可执行文件 - 运行:
REVEL_RUNMODE=prod ./myapp -port=8080 -addr=127.0.0.1 - 此时
revel.AppPath指向二进制所在目录的父级(即项目根),且所有[prod]配置生效 - 注意:不要把二进制放在
$GOPATH/bin下运行,否则revel.AppPath可能定位失败——它依赖可执行文件与conf/目录的相对位置
配置段切换本身不复杂,真正容易出问题的是环境变量传递时机和二进制部署路径。很多线上故障源于 REVEL_RUNMODE 在 shell 脚本中被覆盖,或 systemd service 文件里没设 Environment。










