💼

嵌入文件

使用 zzz 工具打包之后会自动把需要嵌入的静态文件打包入二进制文件中,一切都是无感的,唯一要做的就是把使用 go build 改成使用 zzz build

使用实例

HTTP 服务

// main.go package main import ( "github.com/sohaha/zlsgo/znet" "github.com/sohaha/zstatic" ) func main(){ // 获取一个实例 r := znet.New() // 初始化一个静态目录中间件,必须要先赋值为一个变量 fileserver := zstatic.NewFileserver("static") // 注册静态文件路由 r.GET("/static{file:.*}",fileserver) // 启动 znet.Run() }

HTTP 服务 - 优先本地文件

localFileExist := zarray.NewHashMap[string, []byte]() fileserver := zstatic.NewFileserver("dist", func(c *znet.Context, name string, content []byte, err error) bool { if err != nil { return false } b, ok, _ := localFileExist.ProvideGet(name, func() ([]byte, bool) { path := "dist/" + name if !zfile.FileExist(path) { return nil, true } b, err := zfile.ReadFile(path) if err != nil { return nil, false } return b, true }) // 如果本地文件读取成功就优先显示 if ok && b != nil { m := zfile.GetMimeType(name, b) c.Byte(200, b) c.SetContentType(m) return true } return false }) r.GET(`/admin{file:.*}`, fileserver)

打包模板

// main.go package main import ( "github.com/sohaha/zlsgo/znet" "github.com/sohaha/zstatic" ) type templ struct { t *template.Template } func (t templ) Render(w io.Writer, name string, data interface{}, _ ...string) error { return t.t.Execute(w, data) } func (t templ) Load() error { return nil } func main(){ r := znet.New() // 假设模板目录名为:templates if r.IsDebug() { // 开发模式直接使用本地模板方便测试 r.LoadHTMLGlob("templates/*") } else { // 非开发模式优先使用打包后的文件 t,_ := zstatic.LoadTemplate("templates") r.SetTemplate(templ{ t: t, }) // r.SetHTMLTemplate(t) } r.GET("/html",func(c *znet.Context) { c.Template(200, "index.html", map[string]interface{}{}) }) // 启动 znet.Run() }

日常使用

// main.go package main import ( "github.com/sohaha/zlsgo/zlog" "github.com/sohaha/zstatic" ) func main(){ // 读取文件内容,编译时候会自动把该文件一同打包的 content := zstatic.String("cfg.json") zlog.Println(content) // 目录 group := zstatic.Group("static") _,err := group.MustString("1.txt") if err != nil{ // 文件不存在 } _ = group.String("2.txt") _ = group.Bytes("3.txt") }
# 编译文件,工具会自动嵌入文件打包的 zzz build # 如果需要 自定义 go build 参数,使用 -- 分割 zzz build -P -- -o main
 

 

注意事项

  • 路径是基于项目根目录
  • 不支持 var 赋值
    • // 错误 var g, _ = zstatic.Group("static") // 正确 g, _ := zstatic.Group("static")
  • 只有存在赋值的资源文件才会打包,具体看一下几种
    • // 错误 zstatic.String("cfg.txt") // 正确 _ = zstatic.String("cfg.txt") t := zstatic.String("cfg.txt") // 错误 import ( // 不能给包设置别名 b "github.com/sohaha/zstatic" )
  • 不支持动态赋值路径
    • // 错误 path := "cfg.txt" zstatic.String(path)
  • 分组资源不能直接赋值全局变量
    • package main // 错误 var g, _ := zstatic.Group("static") // 正确 import ("github.com/sohaha/zstatic/build") var g *build.FileGroup func init(){ g, _ = zstatic.Group("static") }
  • 如果多个子包同时引用相同的静态文件那么会出现每个子包都重复内嵌了该文件,所以如果静态文件需要在多个不同的子包内使用,建议建立一个专门管理的静态资源的目录(包),来统一调用。
    • package static_manage import ( "github.com/sohaha/zstatic" "sync" ) var resourceList = map[string]string{} var once sync.Once func init() { once.Do(func() { resourceList["index"] = zstatic.String("static/index.html") resourceList["logo"] = zstatic.String("static/img/my.jpg") }) } func GetStatic(key string) string { if str, ok := resourceList[key]; ok { return str } return "" } // 在项目任意地方调用 // content := static_manage.GetStatic("index")