beego 配置文件默认仅启动时加载一次,多环境切换须依赖 runmode 分区与显式 include;conf/app.conf 是唯一自动加载入口,其他配置需手动 newconfig 加载,且环境变量插值、section 识别、热重载等均有严格限制。

Beego 的配置文件默认只读一次,多环境切换必须靠 runmode + 条件加载,硬编码或运行时改 BConfig 基本无效。
conf/app.conf 是唯一自动加载的配置入口
Beego 启动时会自动解析项目根目录下 conf/app.conf,其他配置文件(比如 mysql.conf)不会被自动识别,必须显式 include 或手动调用 config.NewConfig 加载。
-
include "mysql.conf"写在app.conf里才生效,且只支持 INI 格式嵌套,JSON/YAML 不支持include语法 - 如果用了
runmode = "prod",Beego 会优先读取[prod]section 下的同名 key,覆盖默认 section 的值 - section 名必须全小写,
[PROD]或[Prod]都不会被识别 -
app.conf中的runmode本身不能用 ${ENV} 占位符动态替换——它得是字面量,否则启动直接 panic
环境变量插值只在解析时展开,不支持运行时刷新
app.conf 支持 ${DB_HOST||127.0.0.1} 这类语法,但注意:这仅在 Beego 初始化配置模块那一刻执行一次,后续 os.Setenv 修改环境变量对已加载的配置无影响。
- 常见错误:在
main()开头改了os.Setenv("RUNMODE", "prod"),但beego.Run()已经按原runmode加载完配置,白改 - 正确做法:把环境变量设在启动前,比如
RUNMODE=prod go run main.go,或用 systemd/docker 的 env 机制 -
${GOPATH||/home/user/go}这种带默认值的写法安全,但若环境变量值为空字符串(不是未设置),默认值也不会 fallback
自定义配置文件需绕过自动加载,用 config.NewConfig 手动控制
想加载 conf/redis.yaml 或 conf/log.json,不能依赖 Beego 自动机制,得自己 new 一个配置实例:
redisConf, _ := config.NewConfig("yaml", "conf/redis.yaml")
redisAddr := redisConf.String("addr")
redisDB := redisConf.Int("db")
- 注意驱动包要单独导入:
import _ "github.com/beego/beego/v2/core/config/yaml",否则报unknown config type "yaml" - INI 和 JSON 支持 section,但 YAML/ XML 不支持
section::key语法,只能用点号层级,比如redis.addr - 多个配置源(如 etcd + file)混用时,没有内置 merge 逻辑,得自己按优先级顺序调
String()并判断 fallback
多环境切换最容易忽略的坑:BConfig 不是 AppConfig
beego.BConfig.RunMode 控制框架行为(比如是否显示 debug 页面),而 beego.AppConfig.String("runmode") 读的是配置文件里的字符串值——这两者在 dev 模式下可能一致,但在 prod 下常被误认为可互换。
- 别写
if beego.AppConfig.String("runmode") == "prod"去开关功能,应该用beego.BConfig.RunMode == beego.PROD -
beego.AppConfig只能读app.conf(含 include 的 INI 文件),不能读你手动 New 的配置对象 - 热重载不触发配置重载:
bee run时改了app.conf,进程不会重新 parse,必须重启











