Beego项目必须在$GOPATH/src下执行bee new初始化,否则包导入失败、路由不注册、模板不渲染;因bee工具依赖GOPATH路径解析import,且router.go需显式注册路由,模板渲染须满足路径、配置、beego.Run()三条件。

Beego 项目不能随便建目录就跑,必须用 bee new 在 $GOPATH/src 下初始化,否则包导入失败、路由不注册、模板不渲染——这是新手踩坑率最高的一步。
为什么必须在 $GOPATH/src 下执行 bee new
Beego 的 bee 工具仍基于传统 GOPATH 工作区模型解析包路径,即使项目启用了 go.mod,它仍会按 $GOPATH/src/myapp 推导 import 路径。常见错误包括:
-
cannot find package "myapp/controllers":因为main.go中写的是import "myapp/controllers",而 Go 只在$GOPATH/src下搜索该路径 -
bee run启动后访问/返回 404:本质是控制器包没被加载,路由注册语句失效
实操建议:
- 运行
go env GOPATH确认路径(如/home/user/go) - 进入
$GOPATH/src,再执行bee new myapp - 不要先
mkdir myapp && cd myapp && bee new .—— 这会导致包名推导错乱
router.go 必须显式注册路由,不写等于没写
Beego 不会自动扫描控制器方法,所有路由都需在 routers/router.go 的 init() 函数中手动声明。只定义 MainController 结构体、不注册,请求根本进不来。
常见错误现象:
- 浏览器打开
http://localhost:8080显示 Beego 默认欢迎页(说明根路径没被覆盖) - 自定义的
MainController.Get()完全不触发
实操建议:
- 确保
routers/router.go中有类似beego.Router("/", &controllers.MainController{}) - 若只需响应 GET,可用更轻量的函数式写法:
beego.Get("/", func(ctx *context.Context) { ctx.WriteString("OK") }) - 注意参数必须是控制器指针(
&controllers.XxxController{}),不是类型(controllers.XxxController)
模板渲染失败?三个条件缺一不可
用 c.TplName = "index.tpl" 渲染视图时,以下三点必须同时满足:
-
views/index.tpl文件真实存在(路径严格区分大小写) -
conf/app.conf中templateleft = "{{"和templateright = "}}"已配置(默认已配好,但改过配置要重启bee run) -
main.go中调用了beego.Run()(而非仅http.ListenAndServe)——否则模板引擎根本不启用
容易踩的坑:
- 把
index.tpl放在views/admin/下,却写c.TplName = "index.tpl"(应写"admin/index.tpl") - 模板里写
{{.Data.Website}},但实际传的是c.Data["Website"] = "xxx"(应写{{.Website}})
最常被忽略的是:修改了 app.conf 或新增了控制器文件后,没重启 bee run —— bee 不会自动 reload 配置或新注册的包,必须手动中断再重起。


















