4月9号那天,出了一个线上bug,回家分析了半天,主观原因就不说了,客观原因就在于beego提供的编译打包工具bee不支持配置文件检查。。。研究了半天,关于配置文件的预编译检查,我也没啥想法,不过看了看bee的源码,还是懂了不少,记录一下。
围绕bee run
命令说一下。
- 用这个命令,要进入当前包,检查目录
./conf/app.conf
文件,得到appname
。 - 编译。
go install controllers
,编译生成静态链接库到pkg文件夹下面。此命令还可编译出执行文件到bin文件夹下面。 - 生成可执行文件
go build -o Cyeam main.go
,编译出可执行文件Cyeam。可执行文件的名字就是第一步得到的appnane。 -
启动应用。
appname = "./" + appname cmd = exec.Command(appname) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Args = append([]string{appname}, conf.CmdArgs...) cmd.Env = append(os.Environ(), conf.Envs...) go cmd.Run()
-
关闭应用。启动和关闭都是用了
exec
包,创建进程和关闭进程进行操作的。defer func() { if e := recover(); e != nil { fmt.Println("Kill.recover -> ", e) } }() if cmd != nil && cmd.Process != nil { err := cmd.Process.Kill() if err != nil { fmt.Println("Kill -> ", err) } }
- 文件修改监控。bee命令还有个比较厉害的特性,就是每当文件发生了变化,都能自动编译。这里它使用了开源包
github.com/howeyc/fsnotify
,这是一个开源的文件通知系统。
最后补充点其他的:
-
bee命令还可以有配置文件,名称是
bee.json
。如果你要引用你自己的包,例如github.com/mnhkahn/maodou
,就可以在beego目录下新建bee.json文件,内容如下。此外,bee还支持很多命令,我这里只是抛砖引玉,大家可以自行研究。吐槽一下,bee命令的文档实在是少,想详细了解还是得看代码。{ "version": 0, "gopm": { "enable": false, "install": false }, "go_install": false, "watch_ext": [], "dir_structure": { "watch_all": false, "controllers": "", "models": "", "others": ["$GOPATH/src/github.com/mnhkahn/maodou"] }, "cmd_args": [], "envs": [], "database": { "driver": "mysql" } }
-
还有一个问题,bee命令老给人一个错觉。如果你把项目复制到
/tmp/
目录下,执行bee run,项目还是可以启动的,但实际上编译的是GOPATH下面的项目。编译GOPATH下面的代码也本来也无可厚非,因为这是Golang规定的,但是能编译过并且顺利执行,这就不是很好。经常我想在/tmp目录下测试,然后测了半天发现改的东西没效果。我觉得应该检测出不再GOPATH目录下应该果断通知用户目录错了。
原文链接:bee源码分析,转载请注明来源!
有疑问加站长微信联系(非本文作者)