bee new 必须在$GOPATH/src下执行,否则包导入失败、路由不注册、模板不渲染;因bee依赖传统GOPATH路径解析,即使启用go.mod也只认$GOPATH/src/xxx结构,import路径无法匹配导致编译错误或404。

bee new 必须在 $GOPATH/src 下执行,否则项目无法导入包、路由不注册、模板不渲染——这是 90% 新手启动失败的根源。
为什么 bee new 不能在任意目录运行
Beego 的 bee 工具仍依赖 Go 传统工作区路径解析逻辑。即使你启用了 go.mod,它仍会把项目根路径当作包路径推导(如 myapp/controllers),而 Go 编译器只认 $GOPATH/src/xxx 下的导入路径。
常见错误现象:
-
main.go中import "myapp/controllers"报错:cannot find package "myapp/controllers" - 控制器写好了,
bee run启动后访问/返回 404(本质是包没被加载,路由根本没注册)
实操建议:
- 运行
go env GOPATH确认输出有效路径(如/home/user/go或C:\Users\xxx\go) - 终端进入
$GOPATH/src(Linux/macOS)或%GOPATH%\src(Windows) - 直接执行
bee new myproject,**不要加路径参数**,例如不要写bee new ./myproject或bee new .
routers/router.go 必须显式注册路由
Beego 不会自动扫描控制器方法。只定义 MainController 结构体,但不在 routers/router.go 里调用 beego.Router,等于没写。
常见错误现象:
- 浏览器打开
http://localhost:8080显示 Beego 默认欢迎页(说明根路由没被覆盖) - 自定义的
MainController.Get()完全不触发
实操建议:
- 检查
routers/router.go的init()函数中是否有类似beego.Router("/", &controllers.MainController{})的语句 - 注意传入的是指针
&controllers.XxxController{},不是类型名controllers.XxxController - 如果只是简单返回字符串,可用更轻量方式:
beego.Get("/", func(ctx *context.Context) { ctx.WriteString("OK") })
模板渲染失败的三个硬性条件
用 c.TplName = "index.tpl" 渲染视图时,以下三点缺一不可:
-
views/index.tpl文件真实存在(路径区分大小写;若放在views/admin/下,就得写c.TplName = "admin/index.tpl") -
conf/app.conf中templateleft = "{{"和templateright = "}}"已配置(默认已配好,改过必须重启bee run) -
main.go中调用了beego.Run()(仅写http.ListenAndServe不会启用模板引擎)
容易踩的坑:
- 模板里写
{{.Data.Website}},但实际传的是c.Data["Website"] = "xxx"→ 应写{{.Website}} - 修改了
app.conf但没重启bee run,导致配置不生效
最常被忽略的是:Beego(截至2026年10月1日)仍严格绑定 GOPATH/src 目录结构,哪怕项目有 go.mod,bee 工具也不会绕过这个限制。路径错一步,后面所有调试都是徒劳。











