在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用 Go 开发应用的时候,有时会遇到需要读取静态资源的情况。比如开发 Web 应用,程序需要加载模板文件生成输出的 HTML。在程序部署的时候,除了发布应用可执行文件外,还需要发布依赖的静态资源文件。这给发布过程添加了一些麻烦。既然发布单独一个可执行文件是非常简单的操作,就有人会想办法把静态资源文件打包进 Go 的程序文件中。下面就来看一些解决方案: go-bindata 是目前我的程序
注意 go get 地址最后的三个点 使用命令工具
pugo 里释放静态文件的代码: dirs := []string{"source", "theme", "doc"} // 设置需要释放的目录 for _, dir := range dirs { // 解压dir目录到当前目录 if err := asset.RestoreAssets("./", dir); err != nil { isSuccess = false break } } if !isSuccess { for _, dir := range dirs { os.RemoveAll(filepath.Join("./", dir)) } }
-debug 开发模式
// -pkg=asset, 打包的包名是 asset bytes, err := asset.Asset("theme/default/post.html") // 根据地址获取对应内容 if err != nil { fmt.Println(err) return } t, err := template.New("tpl").Parse(string(bytes)) // 比如用于模板处理 fmt.Println(t, err) http.FileSystem
import ( "net/http" "github.com/elazarl/go-bindata-assetfs" "github.com/go-xiaohei/pugo/app/asset" // 用 pugo 的asset.go进行测试 ) func main() { fs := assetfs.AssetFS{ Asset: asset.Asset, AssetDir: asset.AssetDir, AssetInfo: asset.AssetInfo, } http.Handle("/", http.FileServer(&fs)) http.ListenAndServe(":12345", nil) }
访问 go.ricego.rice 也支持打包静态文件到 go 文件中,但是行为和 安装和
import ( "fmt" "html/template" "github.com/GeertJohan/go.rice" ) func main() { // 这里写相对于的执行文件的地址 box, err := rice.FindBox("theme/default") if err != nil { println(err.Error()) return } // 从目录 Box 读取文件 str, err := box.String("post.html") if err != nil { println(err.Error()) return } t, err := template.New("tpl").Parse(str) fmt.Println(t, err) }
rice 命令
他就会生成当前包名下的、嵌入了文件的代码 http.FileSystem
func main() { // MustFindBox 出错直接 panic http.Handle("/", http.FileServer(rice.MustFindBox("theme").HTTPBox())) http.ListenAndServe(":12345", nil) }
有点略繁琐的是 func main() { http.Handle("/img", http.FileServer(rice.MustFindBox("static/img").HTTPBox())) http.Handle("/css", http.FileServer(rice.MustFindBox("static/css").HTTPBox())) http.Handle("/js", http.FileServer(rice.MustFindBox("static/js").HTTPBox())) http.ListenAndServe(":12345", nil) } escesc 的作者在研究几款嵌入静态资源的工具后,发觉都不好用,就自己写出了 安装
使用方法和
直接支持 import ( "net/http" "asset" // esc 生成 asset/asset.go ) func main() { fmt.Println(asset.FSString(false, "/theme/default/post.html")) // 读取单个文件 http.ListenAndServe(":12345", http.FileServer(asset.FS(false))) // 支持 http.FileSystem,但是没有做展示目录的支持 }
go generate嵌入静态资源的工具推荐配合 go generate 使用。例如 package main import ( "os" "time" "github.com/go-xiaohei/pugo/app/command" "github.com/go-xiaohei/pugo/app/vars" "github.com/urfave/cli" ) //go:generate go-bindata -o=app/asset/asset.go -pkg=asset source/... theme/... doc/source/... doc/theme/... // ......
在编译的时候执行:
这个是 总结我在开发 |
请发表评论