Revel配置文件必须由框架自动加载,不可手动读取;需将app.conf置于conf/目录,用StringDefault/MustString安全读取,且自定义参数须放全局区或对应mode section下,修改后必须重启。

Revel 的配置文件读取不是“能不能读”,而是“必须用对方法、放对位置、避开初始化时机陷阱”——直接 revel.Config.String("key") 会 panic,os.ReadFile("app.conf") 是白忙活。
app.conf 必须放在正确位置且被 Revel 自动加载
Revel 启动时(revel.Harness.Init() 阶段)就用 robfig/config 解析 conf/app.conf 并挂载到全局 revel.Config。你不能自己打开文件读,也不能把 app.conf 放在 app/ 或 public/ 下。
-
conf/app.conf是唯一有效路径;不存在或格式非法(如漏写=、错用空格缩进)会导致启动失败 - 全局配置写在文件最顶部(无
[section]包裹),例如app.name = myapp - 环境相关配置必须写在对应 section 下:
[dev]里的键只在revel run myapp dev时生效,[prod]同理 - 如果当前 mode 没定义某个 key,Revel 会 fallback 到全局值——这是设计行为,不是 bug
读配置必须用 StringDefault / MustString 等安全方法
别碰 revel.Config.String("key"):它不检查 key 是否存在,一为空就 panic。也别自己 strconv.Atoi(revel.Config.String("port")),空字符串转 int 直接崩溃。
-
revel.Config.StringDefault("cache.ttl", "60"):key 不存在或为空时返回默认值"60" -
revel.Config.MustString("db.host"):key 缺失则 panic,适合必填项(如数据库地址) - 同理有
IntDefault、BoolDefault、FloatDefault,类型转换已封装好 - 所有读取操作都应在 Revel 初始化完成后进行——避免在
init()函数里调用,那时revel.Config还没就位
自定义参数读不到?先查这三处硬伤
写 my.api.key = abc123 却读出来是空字符串,90% 是以下原因:
- key 写在了错误 section:比如你在
[prod]下写了,却用revel run myapp dev启动 - 拼写不一致:
my.api.key和my.api_key是两个完全不同的 key,INI 不支持下划线/点混用 - 改完没重启:Revel 不热重载配置文件,
app.conf修改后必须手动 kill 进程再revel run
%(key)s 插值能用但有严格限制
插值发生在配置加载阶段,不是每次 Get 时动态计算。它只支持已定义的 key,不支持系统环境变量或嵌套。
- 合法写法:
app.name = myapp+log.file = %(app.name)s.log→revel.Config.String("log.file")返回"myapp.log" - 非法写法:
log.file = %(HOME)s/app.log(HOME未在 app.conf 中定义) - 非法写法:
log.bak = %(log.file)s.bak(嵌套插值不支持) - 插值结果不可变:即使你后续代码改了
app.name的值,log.file仍保持加载时展开的结果
真正容易被忽略的是:插值只在启动时跑一遍,且 revel.Config 是只读快照——它不监听文件变化,也不支持运行时 reload。配置即代码,改完就得重启。











