Bootstrap

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

思悟项目:

golang qq邮件发送验证码——思悟项目技术1

go语言gin框架平滑关闭——思悟项目技术2


Go 语言默认情况下打包并不会将静态文件直接包含在可执行文件中。Go 编译器只会打包 .go 源代码文件,静态文件(如 HTML、CSS、JS 或图片等)并不会自动包含在生成的二进制文件中。

解决方法如下:

方法一

写一个函数,返回模版文件字符串,比如:

这样我们什么时候使用这个模版,就什么时候调用这个函数。

func GetEmailFormatTemplate() string {
    return `<!-- 邮箱发送验证码模版 -->
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>验证码</title>
    
</head>
<body>
<div class="container">
    <h1>验证码通知</h1>
    <p>亲爱的用户:</p>
    <p>你的验证码为 <span class="code">%s</span>,有效时间为 %d 分钟。</p>
    <div class="footer">如果您没有请求此验证码,请忽略此邮件。</div>
</div>
</body>
</html>
`
}

方法二

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

;