天天看点

go打包静态资源1 xx2 工具准备3 打包静态文件4 模板文件打包后的使用5 静态文件打包后的使用

1 xx

我们知道go编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。

但是在web开发中往往有一些模板,配置文件,css,js,图片等其他类型的静态文件,这些文件是与go可执行文件是相互独立的,部署的时候要另外考虑将这些文件部署到生产环境。如果我们把其他文件和go执行文件打包成一个文件,就可以省去很多麻烦。当然有人会说不是有docker吗?在这里我们不去争论那种方式更优,我们现在只是要提供一种方法,以实现更方便的部署。

2 工具准备

注意后面三个点,以及要将GOPATH/bin加入环境变量

go get -u github.com/jteeuwen/go-bindata/...

go get -u github.com/elazarl/go-bindata-assetfs/...
           

3 打包静态文件

加入要打包的文件夹为static,templates

go-bindata -o=data/data.go -pkg=data templates/... static/...
           

-o=data/data.go:表示打包文件后要输出的文件

-pkg=data:表示输出文件的包名

4 模板文件打包后的使用

引入打包后输出的包:

"github.com/prateeknischal/webtail/data"
           

控制器修改:

// RootHandler - http handler for handling / path
func RootHandler(w http.ResponseWriter, r *http.Request) {


	bytes, err := data.Asset("templates/index.tmpl")  // 根据地址获取对应内容
	if err != nil {
		panic(err)
	}
	t, err := template.New("index").Delims("<<", ">>").Parse(string(bytes))      // 比如用于模板处理

	t = template.Must(t, err)
	if err != nil {
		panic(err)
	}

	var fileList = make(map[string]interface{})

	fileList["FileList"] = util.Conf.Dir
	fileList[csrf.TemplateTag] = csrf.Token(r)
	fileList["token"] = csrf.Token(r)
	t.Execute(w, fileList)
}
           

5 静态文件打包后的使用

引入打包后输出的包及assetfs:

"github.com/elazarl/go-bindata-assetfs"
	"github.com/prateeknischal/webtail/data"
           

文件服务接口修改:

files := assetfs.AssetFS{
		Asset:     data.Asset,
		AssetDir:  data.AssetDir,
		AssetInfo: data.AssetInfo,
		Prefix:    "static",
	}
	//router.PathPrefix("/").Handler(http.FileServer(http.Dir("./static")))

	router.PathPrefix("/").Handler(http.FileServer(&files))
           

参考:

https://studygolang.com/articles/5068

https://blog.csdn.net/wangjunsheng/article/details/80901895

http://www.mamicode.com/info-detail-2158143.html