Revel框架在启动时自动加载conf/app.conf并注入revel.Config,支持INI格式、环境节(如[dev])、默认节合并及大小写敏感键名;配置只读,运行时不可修改,敏感项应通过环境变量覆盖。

Revel 框架的配置文件读写不依赖外部库或手动解析,而是由框架在启动时自动加载 conf/app.conf 并注入全局配置对象 revel.Config;所有环境变量、INI 格式键值对、嵌套节(section)均原生支持,无需额外代码即可按需取用。
app.conf 文件结构与环境区分
Revel 使用标准 INI 格式,通过 [dev]、[prod] 等节名区分运行环境。框架根据 REVEL_RUNMODE 环境变量(默认为 dev)自动加载对应节,并向上合并 [default] 中的通用配置:
-
[default]中定义的app.name = myapp在所有环境下都生效 -
[prod]中的db.url = postgres://...仅在REVEL_RUNMODE=prod时生效 - 未声明节名的顶层配置(如
log.level = DEBUG)等价于写在[default]下 - 节名必须全小写,且不能含空格或特殊字符,否则
revel.Config.String()会返回空字符串
安全读取配置项的三种方式
直接调用 revel.Config.String()、Int()、Bool() 等方法是最常用方式,但需注意默认值和 panic 风险:
- 若键不存在,
String("missing.key")返回空字符串,不会 panic - 若类型不匹配(如用
Int("port")读取port = "abc"),会 panic —— 生产环境务必确保配置格式正确 - 推荐加一层封装,例如:
port := revel.Config.IntDefault("http.port", 9000),避免因缺失或错误导致启动失败 - 读取嵌套节配置需带节名前缀,如
revel.Config.String("db.url")对应[db] url = ...,而非[prod.db](Revel 不支持多级节嵌套)
运行时修改配置不可行,动态参数应走别处
revel.Config 是只读快照,启动后无法写入或 reload —— 这不是 bug,而是设计约束。试图用 revel.Config.Set() 或反射修改会导致未定义行为,且热重载(dev 模式)也只重载代码,不重载配置文件。
- 需要运行时变更的参数(如开关、限流阈值),应存入 Redis 或数据库,控制器中按需查询
- 敏感配置(如密钥、API token)不要硬编码在
app.conf,改用环境变量覆盖:设置REVEL_HTTP_PORT=8080后,revel.Config.Int("http.port")会自动优先取该值 - 若必须从文件动态加载非 Revel 配置(如 YAML 格式的业务规则),应自行用
os.ReadFile+yaml.Unmarshal,与revel.Config完全解耦
真正容易被忽略的是:Revel 会把 conf/app.conf 中所有键名转为小写并用点号连接节名,所以 [Session] cookie.secure = true 实际对应键 session.cookie.secure,而不是 Session.cookie.secure —— 大小写错一个字母,Get() 就永远拿不到值。


















