使用
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 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")