go-zero模板编写并生成
概述
go-zero模板(Template)是数据驱动生成的基础,所有的代码(rest api、rpc、model、docker、kube)生成都会依赖模板
, 默认情况下,模板生成器会选择内存中的模板进行生成,而对于有模板修改需求的开发者来讲,则需要将模板进行落盘, 从而进行模板修改,在下次代码生成时会加载指定路径下的模板进行生成
。
使用方法
1.初始化模板到本地
goctl template init --home $HOME/template
注意
:如果不指定–home 他会初始化到$HOME/.goctl
2.编写tpl模板,修改成自己的模板
例如:修改handler.tpl文件;我是想实现统一格式的body响应
package {{.PkgName}}
import (
"net/http"
"故意写错" //写自己response包的包名,这里可以故意写错,让编译器自动import或者是自己写。一般来说项目不同包路径肯定不同
"github.com/zeromicro/go-zero/rest/httpx"
{{.ImportPackages}}
)
func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
{{if .HasRequest}}var req types.{{.RequestType}}
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
{{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
{{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
{{if .HasResp}}response.Response(w, resp, err){{else}}response.Response(w, nil, err){{end}}
}
}
3.使用tpl模板生成代码
goctl api go --api order.api --dir . --home ../../../template
前面的大家都很熟悉了 --api是被指定生成的api文件;--dir是生成代码的目录;--home就是生成代码指定的模板
总结
- 如果只想
维护一份模板
,那么我们初始化模板的时候和生成代码的时候都不用指定–home了,默认的模板tpl文件在.goctl里面
;初始化模板的时候会提示你在哪
Templates are generated in C:\Users\wangzhirong.goctl\1.5.0, edit on your risk! - 关于
引用包名
;一般来说除非是开源的包,我们可以直接指定写,但是有些包是项目内的包,模板直接指定的话换了项目就不行了;而且容易出错,所以我们可以直接写错,直接爆红
;让开发知道这里是需要自己import的,也可以让编译器自动识别帮你import
已经存在的代码不会再生成
;例如我已经生产了一套代码;现在想用另外的模板生成,只能是把文件删除了然后再生成在模板中添加文件是不生效的
,只能是修改他已有的tpl文件- –remote远端模板;官方的模板最新的是1.3.8;我们目前用的是1.5.0;这两个好像是一样的。
一般情况下不使用远端模板;使用自己本地的就好了;
开发者可能是想我们做一套好用的模板,但是目前看来开源的模板都没几个;这个开源 链接只是增加了事务的模板 - 对于模板的其他操作;例如回滚、清除。回滚其实就是把你修改的东西不要了,要回初始的;清除就是把你的template文件删除了。
写到这里发现我们以前
在生成MongoDB的时候
就很需要修改模板!!
找到mongo/model_types.tpl 里面是:
type {{.Type}} struct {
ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
// TODO: Fill your own fields
UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
}
发现UpdateAt和CreateAt被他固定生成了,很多时候我们都是不需要的;但他会帮我们生成;而且crud的代码存在下面这样的赋值,如果我们生成后再把type里面的删除,下面的代码会爆红;struct代码可以修改;但是crud的代码是NOT EDIT;所以我们需要修改mongo的模板;
data.CreateAt = time.Now()
data.UpdateAt = time.Now()
data.UpdateAt = time.Now()
"time"
在模板中删除上面的代码;然后重新生成