golang 实现静态文件打包到二进制文件中(2)

书接上篇,系统的文件系统放到内存变量中,所以这里需要一个全局变量保存系统文件的文件树!

zipData 是全局压缩数据的变量存储!压缩后放到这个变量中,程序在初始化的时候解压发到对应的结构体中,这里指的就是StatikFS (程序开始执行的时候就初始化到这个结构中啦)。

zipData这个变量是怎么放进去数据的呢?这里是通过遍历文件夹,读取出所有的目录和文件信息,保存到StatikFS 中,并做zip压缩,写到一个go文件中。StatikFS中map的key就是目录地址,例如 a/b/c.js 。这样的形式找到对应的文件!

同时StatikFS 实现FileSystem 接口的Open方法,Open方法就是根据map的key去拿到相应的file信息,包括文件的内容信息!这样fileServer中就可以直接使用StatikFS 啦!golang的接口就是这么神奇!

上边之说了存储在那,没有说怎么存储进去的,这里就要看另个接口实现啦

这个结构体实现了file的所有的接口,重新定义了文件的读取和写入!

文件信息的写入和读取全部指向了StatikFS ,而不是执行系统文件系统!这里可以去代码,很简单!

下边我们来说程序中怎么使用!

我一般分开发环境和正式环境!

正式环境的时候,走上边的流程,最后生成一个二进制文件,放到哪里都可以执行!

开发环境的时候,还是走系统文件,这样方便调试!所以我们定义了全局的开关函数,定义开发或者正式,当然可以定义n多环境,就是麻烦点,很多地方要做处理!

这里看怎么具体打包的!

fs.New() 就是把zipData的数据解压出来放到StatikFS ,作为初始化!

这里直接改成我们新的文件系统就可以啦!

具体代码如上,static目录就是我静态文件的目录!

模板中使用方式如上,读取文件的内容,直接模板解析字符串,就可以实现所有的静态文件打包到二进制文件中啦