golang 实现静态文件打包到二进制文件中(2)
2018年8月22日
书接上篇,系统的文件系统放到内存变量中,所以这里需要一个全局变量保存系统文件的文件树!
1 2 3 4 5 6 7 8 9 10 |
var zipData string type file struct { os.FileInfo data []byte } type StatikFS struct { files map[string]file } |
zipData 是全局压缩数据的变量存储!压缩后放到这个变量中,程序在初始化的时候解压发到对应的结构体中,这里指的就是StatikFS (程序开始执行的时候就初始化到这个结构中啦)。
zipData这个变量是怎么放进去数据的呢?这里是通过遍历文件夹,读取出所有的目录和文件信息,保存到StatikFS 中,并做zip压缩,写到一个go文件中。StatikFS中map的key就是目录地址,例如 a/b/c.js 。这样的形式找到对应的文件!
同时StatikFS 实现FileSystem 接口的Open方法,Open方法就是根据map的key去拿到相应的file信息,包括文件的内容信息!这样fileServer中就可以直接使用StatikFS 啦!golang的接口就是这么神奇!
上边之说了存储在那,没有说怎么存储进去的,这里就要看另个接口实现啦
1 2 3 4 5 6 |
type httpFile struct { file reader *bytes.Reader isDir bool } |
这个结构体实现了file的所有的接口,重新定义了文件的读取和写入!
文件信息的写入和读取全部指向了StatikFS ,而不是执行系统文件系统!这里可以去代码,很简单!
下边我们来说程序中怎么使用!
我一般分开发环境和正式环境!
正式环境的时候,走上边的流程,最后生成一个二进制文件,放到哪里都可以执行!
开发环境的时候,还是走系统文件,这样方便调试!所以我们定义了全局的开关函数,定义开发或者正式,当然可以定义n多环境,就是麻烦点,很多地方要做处理!
这里看怎么具体打包的!
1 |
statikFS, err := fs.New() |
fs.New() 就是把zipData的数据解压出来放到StatikFS ,作为初始化!
1 |
http.FileServer(statikFS) |
这里直接改成我们新的文件系统就可以啦!
1 2 3 4 5 6 7 |
mux := http.NewServeMux() statikFS, err := fs.New() if err != nil { fmt.Println(err) return } mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(statikFS))) |
具体代码如上,static目录就是我静态文件的目录!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
hs := "" //h是静态文件的slice for _, v := range h { v = strings.Replace(v, view_path, "", -1) f1, err := statikView.GetData(v) if err != nil { w.Write([]byte(v + err.Error())) return } hs += string(f1) } t, e = template.New("ss").Parse(hs) |
模板中使用方式如上,读取文件的内容,直接模板解析字符串,就可以实现所有的静态文件打包到二进制文件中啦