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())
}