filebrowser中使用golang嵌入静态文件的实现方法
更新日期:
前几天使用filebrowser作为构建流程产出物的文件上传下载服务器,简单翻了下github上的源代码。filebrowser提供了访问文件列表的页面,前端使用vue开发,后端使用golang开发, 最终会生成一个单一的可执行文件,前端页面直接嵌入在二进制可执行文件中。 于是有兴趣研究了下filebrowser中的静态文件嵌入方法。
filebrowser 源代码结构
filebrowser的源代码就是一个正常的golang项目,在go.mod文件中管理依赖,程序的主入口在main.go中。程序的文件夹结构如下:
1 | filebrowser |
其中http包配置了所有请求的URL路由,使用gorilla作为http服务框架; 而/static路径的处理器getStaticHandler则定义在文件http/static.go下,主要逻辑是根据请求路径从assetsFs文件系统对象中获取文件内容并返回给客户端。assetsFs则来自于frontend/assets.go中定义的对象。
1 | // http/static.go |
接下来看下frontend/assets.go与frontend/assets_dev.go中的内容。frontend/assets.go文件的开头包含2条指令//go:build !dev, // +build !dev 用来指定在非dev模式下使用;接下来是//go:embed dist/* 则指定将dist目录下的所有文件都嵌入到go文件中, 变量assets为embed.FS类型。frontend/dist目录下的文件则是由frontend下的vue项目编译生成的。
frontend/assets.go
1 | //go:build !dev |
而frontend/assets_dev.go则指定只在dev模式下生效, assets为fs.FS类型。在dev模式下, 直接使用文件系统路径,而不是嵌入的文件。
frontend/assets_dev.go
1 | //go:build dev |
参考
- embed是golang的标准库 https://pkg.go.dev/embed
- Golang 编译约束,Go Build Tags https://segmentfault.com/a/1190000042956051