Revel 启动时即解析 app.conf 并挂载至 revel.Config,自定义参数须置于全局区或当前 mode section 下,通过 StringDefault/MustString 等安全读取,支持 %(key)s 插值但不支持环境变量或嵌套。

直接用 revel.Config 读,别自己解析文件;自定义参数必须写在 app.conf 的全局区或对应 mode section 下,否则读不到。
app.conf 的结构和读取时机
Revel 在启动时(revel.Harness.Init() 阶段)就用 robfig/config 解析完 app.conf,并挂到全局的 revel.Config 变量上。你任何时候调用它都是安全的——只要不是在 init() 函数里抢在 Revel 初始化前读。
注意两点:
-
app.conf最顶部未被[dev]或[prod]包裹的 key 是全局生效的,比如app.name、http.port; - 写在
[dev]里的 key 只在revel run myapp dev时生效,[prod]同理;如果当前 mode 没定义某个 key,Revel 会 fallback 到全局值。
读自定义参数:用 StringDefault 或 MustString
假设你在 app.conf 里加了这行(放在全局区或 [dev] 下):
cache.ttl = 300
那么在代码里这样读:
ttl := revel.Config.StringDefault("cache.ttl", "60") —— 如果 key 不存在或为空,返回默认值 "60";
ttl := revel.Config.MustString("cache.ttl") —— 如果 key 不存在,程序 panic,适合配置必填项。
其他类型同理:IntDefault、BoolDefault、FloatDefault。不要自己 strconv.Atoi(revel.Config.String("cache.ttl")),容易 panic。
常见错误:参数读不到的三个原因
你写了 my.api.key = abc123 却读出来是空?检查以下几点:
- 确认写在
app.conf的正确位置:不在任何[section]里,或明确写在当前运行 mode 的 section 下; - 确认没拼错 key 名:
my.api.key和my.api_key是两个不同 key; - 确认没漏 reload:改了
app.conf后,revel run进程要重启,热重载不触发 config 重新加载。
进阶:读带环境变量插值的值
app.conf 支持 %(key)s 插值,比如:
app.name = myapp log.file = %(app.name)s.log
这种写法会被自动展开,revel.Config.String("log.file") 返回的就是 "myapp.log"。但注意:插值只支持已定义的 key,不支持系统环境变量(如 %(HOME)s),也不支持嵌套(%(log.file)s.bak 无效)。
真正容易被忽略的是:插值发生在配置加载阶段,不是每次 Get 时动态计算。所以改了被引用的 key(比如 app.name)后,依赖它的字段不会自动更新——必须重启应用。











