Beego默认只加载conf/app.conf(INI格式),beego.AppConfig读取的始终是该文件;多环境通过runmode+section覆盖实现,而非切换文件;读取其他配置需手动NewConfig创建解析器。

Beego 默认只加载 conf/app.conf,且必须是 INI 格式(除非显式指定其他解析器),直接调用 beego.AppConfig 读取的永远是这个文件里的内容 —— 想读别的文件、别的格式,得自己 new 一个 config.Configer 实例。
beego.AppConfig 只认 conf/app.conf
这是最常被误解的一点:很多人以为改了 runmode 或加了 [dev] section 就算“切换配置文件”,其实不是。它只是在同一个 app.conf 内做 key 的优先级覆盖(比如 httpport 在全局和 [dev] 下都定义时,runmode=dev 时读到的是 [dev] 里的值)。但文件本身不会变。
-
beego.AppConfig.String("httpport")永远从conf/app.conf解析,不支持路径参数 - 如果该文件不存在,程序启动会 panic,错误类似:
open conf/app.conf: no such file or directory - 修改
beego.BConfig.ConfigPath不会影响AppConfig的加载行为,它只控制框架自身初始化用的配置源
读取自定义 INI 文件要用 config.NewConfig
想读 custom/db.conf 或 config/redis.ini 这类独立配置文件,必须手动创建解析器:
conf, err := config.NewConfig("ini", "custom/db.conf")
if err != nil {
log.Fatal(err)
}
dbHost := conf.String("mysql::host")
dbPort, _ := conf.Int("mysql::port")
- 第一个参数是类型名,
"ini"是唯一内置支持的字符串;"json"、"yaml"需要额外 import 对应驱动 - key 支持
section::key形式(如mysql::host),但前提是配置文件里真有[mysql]区块 - 如果 key 不存在,
String()返回空字符串,Int()返回0+error,别漏判 err
INI 中 runmode 分区不是“多环境文件”,而是 key 覆盖规则
配置里写:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
runmode = dev httpport = 8080 [dev] httpport = 8888 [prod] httpport = 80
此时 beego.AppConfig.Int("httpport") 返回 8888,不是因为“加载了 [dev] 文件”,而是因为框架内部做了 key 合并:先加载全局,再按 runmode 值叠加对应 section 的键值对,同名 key 被覆盖。
- 所有 section 名必须是合法标识符(不能含
.、-等),否则解析失败且静默跳过 -
GetSection("dev")可以拿到整个 map,但注意它不包含全局 key,只返回[dev]区块内定义的项 - 没有
[dev]区块时,runmode=dev不会报错,只是不叠加任何额外配置
JSON/YAML 配置需显式注册解析器
Beego 默认不带 JSON/YAML 支持。要用 config.NewConfig("json", "config.json"),必须提前 import 对应包:
import _ "github.com/astaxie/beego/config/json" // 或 import _ "github.com/astaxie/beego/config/yaml"
- JSON 不支持 section,所以 key 不能用
::语法,只能是扁平 key,如"db.host"(依赖结构体 tag 或嵌套 map) - YAML 同理,且缩进敏感;若配置里有 tab 混入空格,解析会失败,错误信息往往只报
invalid character,难定位 - 所有非 INI 格式都不支持
runmode分区逻辑,想实现环境隔离得靠外部控制文件路径(如config.dev.json/config.prod.json)
真正麻烦的从来不是“怎么读”,而是“谁在什么时候读”——beego.AppConfig 在 beego.Run() 前就完成了初始化,之后改文件内容不会自动重载;而自己 new 的 config.Configer 实例,生命周期完全由你控制,但也要小心重复解析或并发读写冲突。










