golang打包封装静态资源 go-bindata

分类:技术文档 - Golang | 阅读(409) | 发布于:2019-04-01 20:55

使用 Go 开发应用的时候,有时会遇到需要读取静态资源的情况。 比如开发 Web 应用,程序需要加载模板文件生成输出的 HTML。 在程序部署的时候,除了发布应用可执行文件外,还需要发布依赖的静态资源文件。这给发布过程添加了一些麻烦。 既然发布单独一个可执行文件是非常简单的操作,就有人会想办法把静态资源文件打包进 Go 的程序文件中。
下面就来看一个解决方案:go-bindata

go-bindata 可以把多个静态文件内容转码嵌入到一个 go 文件中,并提供一些操作方法。

安装 go-bindata :

go get -u github.com/jteeuwen/go-bindata/...
注意 go get 地址最后的三个点 ...。这样会分析所有子目录并下载依赖编译子目录内容。go-bindata 的命令工具在子目录中。

使用 go-bindata :

go-bindata -o=app/asset/asset.go -pkg=asset source/... theme/... doc/source/... doc/theme/... 
-o 输出文件到 app/asset/asset.go,包名 -pkg=asset,然后是需要打包的目录,三个点包括所有子目录。
这样就可以把所有相关文件打包到asset包的asset.go文件中,且开头是 package asset 保持和目录一致。

项目中释放静态文件的代码 :

dirs := []string{"source", "theme", "doc"} // 设置需要释放的目录

for _, dir := range dirs {
    // 解压dir目录到当前目录
    if err := asset.RestoreAssets("./", dir); err != nil {
        fmt.Println("RestoreAssets ", dir, "error", "\n", err)
    }
}
asset.go 内的静态内容还是根据实际的目录位置索引。所以我们可以直接通过目录或者文件地址去操作。

遇到的坑:

1. 安装时没有权限 : Windows上运行没有权限的使用管理员身份运行
2. go-bindata找不到路径: 记得把 $GOPATH/bin 加入系统 PATH
3. 生成的压缩包文件太大,goland编辑器加载出错:[the file size(10M) exceeds configured limit(4M).Code insight features are not available] :重新设置编辑器IDE的idea.max.intellisense.filesize值:(idea.max.intellisense.filesize=10240)
4. 解压操作[RestoreAssets]可以放到init()的函数中,项目启动后优先启动。
5. 流程:先使用go-bindata打包静态资源目录及文件[go-bindata -o=asset\asset.go -pkg=asset webServer/...],然后使用go build命令生成二进制可执行文件,最后把该可执行文件复制到其运行目录就可以直接运行而不丢失静态资源文件。
6. go-bindata命令必须指定一个"-pkg asset",并且"-o asset/asset.go"? 此处的pkg不能直接使用main吗,直接放生成main包里面的文件并且放入main包后 代码内调用RestoreAssets函数报错。。。

标签: