go语言静态资源打包——思悟项目技术3-方法二

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 文件中的字节数据,并打包到最终的二进制文件中。

上一篇:在使用asm包进行动态类加载的时候的打包问题


下一篇:浅谈——深度学习和马尔可夫决策过程-深度学习的原理