Revel 框架通过 conf/app.conf 文件配合 REVEL_RUNMODE 环境变量实现多环境配置,启动时按 RUNMODE 加载对应 section(如 [prod]),需确保 section 名完全匹配、db.url 等敏感配置按环境隔离、自定义项用 revel.Config.StringDefault 安全读取。

Revel 框架的多环境配置靠 conf/app.conf 和 REVEL_RUNMODE
Revel 不用 .env 文件,也不依赖外部环境变量注入工具。它原生通过 conf/app.conf 文件 + REVEL_RUNMODE 环境变量实现多环境切换。框架启动时自动加载对应 section,比如 REVEL_RUNMODE=prod 就读 [prod] 下的配置项。
常见错误是手动改 app.conf 里 run.mode = dev 这一行——这行只在没设 REVEL_RUNMODE 时兜底生效,部署时容易被忽略,导致明明配了 prod 却还走 dev 分支。
-
conf/app.conf必须存在,且至少包含一个[dev]section,否则启动失败 - 所有环境共用同一份
app.conf,不同环境的配置写在各自 section 下(如[development]、[production]) -
REVEL_RUNMODE值必须和配置文件中的 section 名完全一致(区分大小写),比如不能设成REVEL_RUNMODE=Production - section 内可覆盖任意配置项:数据库地址、日志级别、模板缓存开关、静态资源路径等
数据库连接等敏感配置必须按环境隔离
Revel 的 db.url、redis.addr 这类连接串,不能写死在 [dev] 或全局位置。一旦多个环境共用同一段配置,就可能像知识库说的那样:“整个服务的数据全写乱了”。
正确做法是在每个环境 section 下单独定义:
[development] db.url = "root:@tcp(127.0.0.1:3306)/myapp_dev?parseTime=true" log.level = DEBUG [production] db.url = "app_ro:@tcp(prod-db.internal:3306)/myapp_prod?parseTime=true&readTimeout=5s" log.level = INFO db.maxOpenConns = 50
- 开发环境允许 root 权限、本地直连;生产环境必须用最小权限账号、加
readTimeout、限制连接池大小 - 测试环境建议用独立数据库实例,避免用生产备份数据——否则测试脚本一跑,可能触发真实支付回调
- 不要在
app.conf里写密码明文;应通过系统环境变量注入,例如db.url = "${DB_USER}:${DB_PASS}@tcp(...)",再由部署流程注入
运行时无法动态切换 REVEL_RUNMODE,部署前必须确认
Revel 在进程启动瞬间就锁定 REVEL_RUNMODE 并加载对应配置,之后修改该变量无效。这意味着你不能在容器内起服务后再改环境变量来“热切”环境——它只读一次。
典型踩坑场景:
- Docker 启动命令漏写
-e REVEL_RUNMODE=prod,结果用默认dev模式连了线上 DB - Kubernetes ConfigMap 挂载了
app.conf,但没在 Deployment 的 env 中显式声明REVEL_RUNMODE,导致 fallback 到dev - 本地调试时 export 了
REVEL_RUNMODE=prod,忘了 unset,后续跑单元测试也连错库
验证方式很简单:启动后访问 /revel/cmd(仅 dev 模式开放),或直接打印 revel.BEConfig.String() 查看实际加载的 section 名。
自定义配置项要用 revel.Config.String() 安全读取
你在 app.conf 里加的自定义字段,比如 api.timeout = 3000,不能直接用 os.Getenv() 或硬编码。必须通过 Revel 提供的配置接口读取,否则跨环境时会拿错值或 panic。
示例代码:
timeout := revel.Config.IntDefault("api.timeout", 5000)
dbUrl := revel.Config.StringDefault("db.url", "")
if dbUrl == "" {
revel.ERROR.Fatal("db.url is required in app.conf")
}
-
StringDefault和IntDefault是安全读法,第二个参数是 fallback 值,避免空值崩溃 - 不要用
revel.Config.String("db.url")直接取——如果该 key 不存在,会返回空字符串,而空字符串在连接数据库时往往静默失败 - 所有自定义配置都应在
[dev]和[production]下保持字段名一致,只变值
最易被忽略的一点:Revel 的配置加载不支持嵌套结构(比如 JSON/YAML 风格),也不支持文件继承或 extends 机制。所有环境差异必须显式写在对应 section 下,少写一行就可能让生产环境沿用开发配置。


















