這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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源碼分析,轉載請註明來源!