Gin Web框架:静态资源嵌入
例子:
目录结构为:
main.go 文件:(main.go 中缺失的一些变量在assets.go 文件中,等到我们生成 assets.go 后 main.go 文件就不会报错了)
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"html/template"
"io/ioutil"
"strings"
)
func main() {
r := gin.New()
t, err := loadTemplate()
if err != nil {
panic(err)
}
r.SetHTMLTemplate(t)
r.GET("/", func(c *gin.Context) {
c.JSON(200, "hello world")
})
r.Run(":8080")
}
// loadTemplate 加载由 go-assets-builder 嵌入的模板
func loadTemplate() (*template.Template, error) {
t := template.New("") // 空模版
// 把从文件中读取的内容添加到这个模板中
// Assets 是通过 go-assets-builder 生成的静态资源对象。Assets.Files 包含所有被打包的文件。
// name 是文件的路径,file 是表示文件内容的对象。
for name, file := range Assets.Files {
// 打印每个被打包的文件名
fmt.Println("Loaded static file:", name)
// .tmpl、.html 和 .txt 文件都可以被打包并在程序中使用。
if file.IsDir() || (!strings.HasSuffix(name, ".tmpl") && !strings.HasSuffix(name, ".html") && !strings.HasSuffix(name, ".txt")) {
continue
}
h, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
// 在模板对象 t 中创建一个新的模板(名称为 name),并将读取到的文件内容解析为模板。
t, err = t.New(name).Parse(string(h))
if err != nil {
return nil, err
}
}
return t, nil
}
步骤如下:
1. 安装 go-assets-builder
go install github.com/jessevdk/go-assets-builder@latest
2. 生成静态资源:使用 go-assets-builder 将静态资源打包成 Go 代码:
go-assets-builder -o assets.go template/emailFormatTemplate.html
这个命令会将 template 目录下 emailFormatTemplate.html 文件打包到 assets.go 文件中。你可以在这个文件中看到 Assets 变量的定义,它包含了静态资源。
生成了一个 assets.go 文件:
3. 编译并运行:静态资源会被打包进可执行文件中:
go build -o myapp
./myapp
解释:
- go-assets:这是将静态资源打包到 Go 二进制文件中的工具,允许你在运行时直接访问打包进来的文件。
- Assets.Files:生成的 assets.go 文件中,会创建 Assets 变量,包含所有打包的文件信息。loadTemplate 函数遍历这些文件,读取内容,并解析成模板。
- html/template:Gin 使用标准库的 html/template 来渲染 HTML 页面。
这样做的好处是,可以把所有的资源打包到一个可执行文件中,使部署更加方便,无需额外的文件管理。
其实本质上解决这个静态资源打包问题的方法都是:先读取这个模版,把静态资源转换为 Go 文件中的字节数据,并打包到最终的二进制文件中。