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.youkuaiyun.com/wangjunsheng/article/details/80901895
http://www.mamicode.com/info-detail-2158143.html