背景:
使用gin gonic/gin Web服务器和HTML模板创建单个二进制文件
代码:
main.go
package main
import (
"html/template"
"io/ioutil"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.New()
t, err := loadTemplate()
if err != nil {
panic(err)
}
r.SetHTMLTemplate(t)
r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "/html/index.tmpl", gin.H{
"Foo": "World",
})
})
r.GET("/bar", func(c *gin.Context) {
c.HTML(http.StatusOK, "/html/bar.tmpl", gin.H{
"Bar": "World",
})
})
r.Run(":8080")
}
func loadTemplate() (*template.Template, error) {
t := template.New("")
for name, file := range Assets.Files {
if file.IsDir() || !strings.HasSuffix(name, ".tmpl") {
continue
}
h, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
t, err = t.New(name).Parse(string(h))
if err != nil {
return nil, err
}
}
return t, nil
}
html
bar.tmpl
<!doctype html>
<body>
<p>Can you see this? → {{.Bar}}</p>
</body>
index.tmpl
<!doctype html>
<body>
<p>Hello, {{.Foo}}</p>
</body>
安装go-assets-builder
go get github.com/jessevdk/go-assets-builder
使用o-assets 生成go file
go-assets-builder html -o assets.go
查看生成的assets.go
assets.go
package main
import (
"time"
"github.com/jessevdk/go-assets"
)
var _Assetsbfa8d115ce0617d89507412d5393a462f8e9b003 = "<!doctype html>\n<body>\n <p>Can you see this? → {{.Bar}}</p>\n</body>\n"
var _Assets3737a75b5254ed1f6d588b40a3449721f9ea86c2 = "<!doctype html>\n<body>\n <p>Hello, {{.Foo}}</p>\n</body>\n"
// Assets returns go-assets FileSystem
var Assets = assets.NewFileSystem(map[string][]string{"/": {"html"}, "/html": {"bar.tmpl", "index.tmpl"}}, map[string]*assets.File{
"/": {
Path: "/",
FileMode: 0x800001ed,
Mtime: time.Unix(1524365738, 1524365738517125470),
Data: nil,
}, "/html": {
Path: "/html",
FileMode: 0x800001ed,
Mtime: time.Unix(1524365491, 1524365491289799093),
Data: nil,
}, "/html/bar.tmpl": {
Path: "/html/bar.tmpl",
FileMode: 0x1a4,
Mtime: time.Unix(1524365491, 1524365491289611557),
Data: []byte(_Assetsbfa8d115ce0617d89507412d5393a462f8e9b003),
}, "/html/index.tmpl": {
Path: "/html/index.tmpl",
FileMode: 0x1a4,
Mtime: time.Unix(1524365491, 1524365491289995821),
Data: []byte(_Assets3737a75b5254ed1f6d588b40a3449721f9ea86c2),
}}, "")
生成二进制文件
构建二进制镜像
go build -o assets-in-binary
运行二进制文件
./assets-in-binary
访问localhost:8080
->curl localhost:8080
<!doctype html>
<body>
<p>Hello, World</p>
</body>->
参考:
go-assets
go assets是一个简单的嵌入资产生成器和go的消费者库。该库的主要用途是生成和嵌入内存中的小文件系统,这些文件系统可以集成到运行时使用少量资源的web服务器或其他服务中。这对于能够使用资产执行单个二进制部署非常好。
生成器类型可用于从磁盘上的文件和目录生成包含内存中文件树的go文件。可以选择使用gzip压缩文件数据以减小文件大小。之后,生成的文件可以包含在应用程序中,并且可以直接访问这些资产,而无需从磁盘加载它们。生成的assets变量的类型为FileSystem,并实现os.FileInfo和http.FileSystem接口,以便它们可以直接与http.FileHandler一起使用