20 April 2015
beego编译工具bee的源码分析。这里只介绍bee run原理。

4 月 9 号那天,出了一个线上 bug,回家分析了半天,主观原因就不说了,客观原因就在于 beego 提供的编译打包工具 bee 不支持配置文件检查。。。研究了半天,关于配置文件的预编译检查,我也没啥想法,不过看了看 bee 的源码,还是懂了不少,记录一下。

围绕bee run命令说一下。

  1. 用这个命令,要进入当前包,检查目录./conf/app.conf文件,得到appname
  2. 编译。go install controllers,编译生成静态链接库到 pkg 文件夹下面。此命令还可编译出执行文件到 bin 文件夹下面。
  3. 生成可执行文件go build -o Cyeam main.go,编译出可执行文件 Cyeam。可执行文件的名字就是第一步得到的 appnane。
  4. 启动应用。

    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()
    
  5. 关闭应用。启动和关闭都是用了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)
    	}
    }
    
  6. 文件修改监控。bee 命令还有个比较厉害的特性,就是每当文件发生了变化,都能自动编译。这里它使用了开源包github.com/howeyc/fsnotify,这是一个开源的文件通知系统。

最后补充点其他的:

  1. 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"
    	}
    }
    
  2. 还有一个问题,bee 命令老给人一个错觉。如果你把项目复制到/tmp/目录下,执行 bee run,项目还是可以启动的,但实际上编译的是 GOPATH 下面的项目。编译 GOPATH 下面的代码也本来也无可厚非,因为这是 Golang 规定的,但是能编译过并且顺利执行,这就不是很好。经常我想在/tmp 目录下测试,然后测了半天发现改的东西没效果。我觉得应该检测出不再 GOPATH 目录下应该果断通知用户目录错了。


原文链接:bee源码分析,转载请注明来源!

EOF