3.3 部署及元编程工具 fay

fay工具是一个Go项目的辅助工具。具体功能如下:

  • 新建、编译、运行(实时监控文件变动)一个新的faygo项目
  • 支持热编译模式运行任意的golang程序
  • 提供Faygo的元编程工具包

3.3.1 安装fay工具

  • 首次下载安装
  1. go get -u -v github.com/henrylee2cn/fay
  • 已有源码的安装
  1. cd $GOPATH/src/github.com/henrylee2cn/fay
  2. go install

3.3.2 fay命令说明

  1. fay command [arguments]
  2. The commands are:
  3. new 创建、编译和运行(监控文件变化)一个新的faygo项目
  4. run 编译和运行(监控文件变化)任意一个已存在的golang项目
  5. fay new appname [apptpl]
  6. appname 指定新faygo项目的创建目录
  7. apptpl 指定一个faygo项目模板(可选)
  8. fay run [appname]
  9. appname 指定待运行的golang项目路径(可选)

3.3.3 快速创建新项目

项目名(含路径) 项目模板(目前仅有一个默认模板simple)
./myapp simple(默认模板,可省略)
  1. fay new ./myapp simple

因项目模板simple为默认模板,所以可以省略该参数

  1. fay new ./myapp

执行上述命令后,会在./myapp目录下自动生成一个单实例单监听的应用。该实例名称即为myapp

3.3.4 以热编译模式运行项目

热编译是指项目源码发生改变后自动重新编译项目,并平滑重启该项目程序,从而将项目重新编译对服务带来的影响降到最低。

  1. cd ./myapp
  2. fay run

或者

  1. fay run ./myapp

执行上述命令后,会自动编译myapp项目,并且监控该项目目录下的文件变化。

当有文件发生改变后,自动重新编译该项目,然后Kill掉当前项目进程,最后启动更新后的新执行文件。

3.3.5 faygo的元编程

fay工具提供了faygo的元编程函数。导入工具包:

  1. import "github.com/henrylee2cn/fay/generator"

我们通过一个小示例展示如何使用generator包自动生成faygo项目代码:

  1. // 创建一个结构体类型的Handler操作
  2. var structure = &StructHandler{
  3. Dir: "./test/handler",
  4. Name: "Index",
  5. UrlPath: "/test/index",
  6. Method: "POST",
  7. Fields: []Field{
  8. {
  9. Type: "string",
  10. Name: "Title",
  11. In: "query",
  12. Desc: "title param",
  13. },
  14. {
  15. Type: "*http.Cookie",
  16. Name: "Cookie",
  17. In: "cookie",
  18. Desc: "cookie param",
  19. },
  20. },
  21. Note: "index handler",
  22. Return: "{}",
  23. }
  24. // 创建一个函数类型的Handler操作
  25. var function = &FuncHandler{
  26. Dir: "./test/handler",
  27. Name: "Index2",
  28. UrlPath: "/test/index2",
  29. Method: "GET",
  30. }
  31. // 创建一个函数类型的中间件(中间件与操作完全相同)
  32. var middleware = &FuncHandler{
  33. Dir: "./test/middleware",
  34. Name: "middleware",
  35. UrlPath: "/test",
  36. }
  37. // 创建一个路由
  38. var router, err = NewRouter("MyappRoute", "./test/router")
  39. if err != nil {
  40. t.Logf("%v", err)
  41. }
  42. // 注册路由
  43. router.AddHandler(structure) // 注册操作
  44. router.AddHandler(function) // 注册操作
  45. router.AddMiddleware(middleware) // 注册中间件
  46. router.AddStatic("static fs", "/test/static", "./test/static/test", true, false) // 注册静态路由
  47. // 创建main文件
  48. m, err := NewMain("./test")
  49. if err != nil {
  50. t.Logf("%v", err)
  51. }
  52. m.AddFrame(router, "myapp", "1.0")
  53. // 输出项目文件
  54. err := m.Output()
  55. if err != nil {
  56. println(err.Error())
  57. }