beego 仅加载根目录 conf/app.conf 且必须严格符合 INI 规范;配置读取需用类型专属方法并检查 err;runmode 切换不 fallback 全局 section;include 路径相对 conf/ 且后加载项覆盖先加载项。

app.conf 文件位置和基础格式必须严格符合 INI 规范
beego 默认只加载项目根目录下 conf/app.conf,路径错一个字符(比如写成 config/app.conf 或 conf/app.conf.bak)都会静默失败,不会报错,但所有配置读取都返回空或默认值。
文件内容必须是标准 INI 格式:键值对顶格写,等号前后不能有空格,注释只能用分号 ; 开头且必须独占一行;行尾加空格、中文分号、# 号注释、等号两边有空格,都会导致解析失败 —— 尤其常见于复制粘贴时带入不可见 Unicode 字符。
-
httpport = 8080✅ 正确 -
httpport=8080 ; 开发端口✅ 正确(分号注释) -
httpport = 8080 # 开发端口❌ 失效(# 不被识别) -
httpport = 8080❌ 失效(末尾有空格)
读取配置项要用 AppConfig 对应类型方法,别全用 String()
beego.AppConfig.String("httpport") 返回的是字符串 "8080",不是整数;如果后续直接传给 http.ListenAndServe 会 panic,因为该函数需要 int 类型端口号。
正确做法是用类型专属方法,它们自带类型转换和错误检查:
-
port, err := beego.AppConfig.Int("httpport")—— 转int,失败时err != nil -
timeout, err := beego.AppConfig.Float("readtimeout")—— 转float64 -
debug := beego.AppConfig.Bool("autorender")—— 注意Bool()只识别true/false字符串,不识别1/0或on/off
所有非 String() 方法都返回两个值,务必检查 err,否则类型转换失败时会拿到零值(比如 Int 返回 0),极难排查。
runmode 切换后,section 配置不会自动 fallback 到全局
当 runmode = prod 时,beego.AppConfig.String("mysqluser") 会先查 [prod] 下的 mysqluser,查不到就返回空字符串,**不会回退到全局 section(即文件开头无 section 的部分)**。
所以推荐写法是:把通用配置放全局,环境特有配置放对应 section,并确保每个 section 都显式覆盖关键项:
appname = myapp httpport = 8080 ; 全局默认值,供 dev/test/prod 共享 mysqlurls = "127.0.0.1" <p>[dev] mysqluser = "root" mysqlpassword = "dev123" mysqldb = "myapp_dev"</p><p>[prod] mysqluser = "appuser" mysqlpassword = "s3cr3t!" mysqldb = "myapp_prod"</p>
如果漏写 [prod] mysqldb,beego.AppConfig.String("mysqldb") 在 prod 模式下就返回空,而不是用全局的 myapp_dev —— 这是新手最容易踩的坑。
想拆分配置文件?用 include 但注意路径和加载顺序
在 conf/app.conf 里写 include "mysql.conf" 是可行的,但要注意三点:
- 路径是相对于
conf/目录的,不是项目根目录;include "db/mysql.conf"表示文件在conf/db/mysql.conf -
include行本身不能带空格或注释,必须是纯include "xxx" - 被 include 的文件也必须是 INI 格式,且其中定义的 key 会**覆盖**主文件中同名 key —— 顺序很重要,后加载的生效
例如:app.conf 里先写 mysqluser = "root",再 include "mysql.conf",而 mysql.conf 里也有 mysqluser = "produser",最终读到的就是 "produser"。
复杂项目建议只 include 一次,且把敏感配置(如密码)单独放在被 include 文件中,避免误提交到 Git。


















