beego 本身不支持运行时替换控制器代码,其“热重载”实为 bee 工具监听文件变更后自动重启进程;必须用 bee run 启动、配置 bee.json 扩展 watch_ext、修复语法错误并切换持久化 session 才能保障开发体验。

Beego 本身不支持运行时替换控制器代码,所谓“热加载”其实是 bee 工具监听文件变更后自动终止旧进程、重新编译并启动新进程——它不是真正的 hot patch,但足够快,能显著减少手动重启的等待。
用 bee run 启动才是热重载生效的前提
直接执行 go run main.go 或运行已编译的二进制文件,bee 完全不介入,自然不会监听、不会重启。只有 bee run 才会加载 bee.json 配置、启动文件监听器、捕获 SIGHUP 并触发构建流程。
- 确保项目根目录下有
main.go且调用了beego.Run() - 确认
controllers/、models/、conf/app.conf等标准目录结构完整 - 如果终端没输出
[INFO] Restarting xxx日志,大概率没走bee run流程
bee.json 中的 watch_ext 决定哪些修改会触发重启
默认只监听 .go 文件,改了模板(.tpl)、配置(app.conf)或静态资源(.js)不会重启——必须显式扩展监听后缀。
- 在项目根目录新建
bee.json,内容至少包含:{ "watch_ext": ["go", "conf", "tpl", "html", "js", "css"] } - 修改后缀列表后需重启
bee run才生效(首次加载只读一次) -
exclude字段可排除干扰目录,比如node_modules或logs/,避免误触发
语法错误会让热重载“卡住”,必须人工干预
一旦控制器里出现未使用的变量、缺少右括号或 import 错误,bee 编译失败,进程停止,也不会再监听后续保存动作——控制台会停在报错日志,不再输出 [INFO] Restarting。
- 典型错误信息如:
./controllers/user.go:12:9: undefined: xxx或./main.go:5:2: imported and not used: "fmt" - 此时必须修复代码、保存,
bee才会恢复监听并尝试下一次构建 - 开发期建议开启 IDE 的实时语法检查(如 GoLand 的 inspection),提前拦截这类问题
Session 丢失是必然的,别指望内存态会话跨重启存活
每次重启都是全新进程,所有内存数据清空。如果你用的是默认的 memory Session provider,登录态、临时数据全丢。
- 开发阶段最轻量的解法:改用
fileprovider,在conf/app.conf中加session.provider = file session.provider_config = ./tmp/session
- 若已有 Redis 环境,更推荐
redisprovider,配置项为session.provider_config = 127.0.0.1:6379,0,beego_session - 切记不要在生产环境用
file或memory,这是开发期妥协方案
真正容易被忽略的是:热重载延迟虽短(1–3 秒),但网络请求可能正在途中;前端若发了异步请求,恰好撞上重启窗口,就会收到 connection refused 或超时。这不是 bug,是进程模型决定的边界条件,需要前端做简单重试或 loading 状态兜底。











