Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go打包静态文件

Go打包静态文件的两种方式

作者:beyondyou

使用 Go 开发应用的时候,有时会遇到需要读取静态资源的情况,如果不打包处理这种静态文件:发布单独挂载这种静态文件相对比较麻烦,就有人会想办法把静态资源文件打包进 Go 的程序文件中,下面介绍两种打包方式:go-bindata、go:embed,需要的朋友可以参考下

一、前言

使用 Go 开发应用的时候,有时会遇到需要读取静态资源的情况。

如果不打包处理这种静态文件:发布单独挂载这种静态文件相对比较麻烦,就有人会想办法把静态资源文件打包进 Go 的程序文件中。

下面介绍两种打包方式:go-bindata、go:embed

二、go-bindata打包静态资源

go-bindata 将任何文件封装在一个 Go 语言的 Source Code 里面,文件数据在转换为原始字节时可以选择使用 gzip 压缩,同时提供了统一的接口,帮助获取原始的文件数据

2.1 安装

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

安装打包工具 go-bindata 到GOPATH/bin中,输入下面的命令检查下是否安装成功:

go-bindata  --version

2.2 打包

go-bindata -o=resource.go -pkg=resource   ./resource/...

如果你查看源文件,可以查看 _bindata 中维护了文件的信息

2.3 使用

三、go:embed 打包静态资源

Go 1.16版本开始,可以使用go:embed来嵌入文件。

embed是在Go 1.16中新加包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序(exe)中,并提供访问这些文件的能力。

注意:go embed的使用只能用于包级别声明的变量(全局变量)

3.1 embed 要嵌入的文件

//go:embed 要嵌入的文件
import (
    _ "embed"
    "fmt"
)
​
//go:embed repos.tmpl
var data string
​
func main() {
    fmt.Println(data)
}
import (
    _ "embed"
    "fmt"
)
​
//go:embed repos.tmpl
var data []byte
​
func main() {
    fmt.Println(string(data))
}

3.2 嵌入文件系统FS

对于多个文件和文件夹,支持嵌入为新的文件系统FS

embed.FS提供了三个方法进行访问:

Open(name string) (fs.File, error)   根据资源key返回文件
​
ReadFile(name string) ([]byte, error)  根据资源key返回文件内容
​
ReadDir(name string) ([]fs.DirEntry, error)  根据key读取文件夹   

使用embed.FS嵌入的文件变量,具有3种功能,如下所示:

import (
    "embed"
    _ "embed"
    "fmt"
)
​
//go:embed resource
var data embed.FS
​
func main() {
    // 直接读取文件
    file, err := data.ReadFile("resource/cmd/main.go.tmpl")
    fmt.Println(string(file), err)
}
import (
    "embed"
    _ "embed"
    "fmt"
)
​
//go:embed aa.text bb.text
var data embed.FS
​
func main() {
    file, err := data.ReadFile("aa.text")
    fmt.Println(string(file), err)
}

到此这篇关于Go打包静态文件的两种方式的文章就介绍到这了,更多相关Go打包静态文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文