Skip to content

Latest commit

 

History

History
155 lines (120 loc) · 3.7 KB

03.03.md

File metadata and controls

155 lines (120 loc) · 3.7 KB

3.3 部署及元编程工具 fay

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

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

3.3.1 安装fay工具

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

3.3.2 fay命令说明

        fay command [arguments]

The commands are:
        new        创建、编译和运行(监控文件变化)一个新的faygo项目
        run        编译和运行(监控文件变化)任意一个已存在的golang项目

fay new appname [apptpl]
        appname    指定新faygo项目的创建目录
        apptpl     指定一个faygo项目模板(可选)

fay run [appname]
        appname    指定待运行的golang项目路径(可选)

3.3.3 快速创建新项目

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

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

fay new ./myapp

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

3.3.4 以热编译模式运行项目

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

cd ./myapp
fay run

或者

fay run ./myapp

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

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

3.3.5 faygo的元编程

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

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

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

// 创建一个结构体类型的Handler操作
var structure = &StructHandler{
  Dir:     "./test/handler",
  Name:    "Index",
  UrlPath: "/test/index",
  Method:  "POST",
  Fields: []Field{
    {
      Type: "string",
      Name: "Title",
      In:   "query",
      Desc: "title param",
    },
    {
      Type: "*http.Cookie",
      Name: "Cookie",
      In:   "cookie",
      Desc: "cookie param",
    },
  },
  Note:   "index handler",
  Return: "{}",
}
// 创建一个函数类型的Handler操作
var function = &FuncHandler{
  Dir:     "./test/handler",
  Name:    "Index2",
  UrlPath: "/test/index2",
  Method:  "GET",
}
// 创建一个函数类型的中间件(中间件与操作完全相同)
var middleware = &FuncHandler{
  Dir:     "./test/middleware",
  Name:    "middleware",
  UrlPath: "/test",
}
// 创建一个路由
var router, err = NewRouter("MyappRoute", "./test/router")
if err != nil {
  t.Logf("%v", err)
}
// 注册路由
router.AddHandler(structure) // 注册操作
router.AddHandler(function) // 注册操作
router.AddMiddleware(middleware) // 注册中间件
router.AddStatic("static fs", "/test/static", "./test/static/test", true, false) // 注册静态路由
// 创建main文件
m, err := NewMain("./test")
if err != nil {
  t.Logf("%v", err)
}
m.AddFrame(router, "myapp", "1.0")
// 输出项目文件
err := m.Output()
if err != nil {
  println(err.Error())
}

links