最近蚊子在学习beego,beego是一个开源的golang web开发框架。具体beego相关文档,请移步官方网站。网站开发完成,自然就需要涉及到打包发布的过程。但在看了beego的打包发布后发现,beego并没有将静态文件编译到生成的二进制文件中。对于大型的网站来说,静态文件和二进制分离固然好,可以引用nginx, 单独服务静态文件同时反向代理go动态内容。可对于只有一页的工具类页面,总觉得怪怪的,
以下内容引用自beego文档
发行部署
Go 语言的应用最后编译之后是一个二进制文件,你只需要 copy 这个应用到服务器上,运行起来就行。beego 由于带有几个静态文件、配置文件、模板文件三个目录,所以用户部署的时候需要同时 copy 这三个目录到相应的部署应用之下
beego自身还有个一个工具叫“bee“
bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 您可以很容易的进行 beego 项目的创建、热编译、开发、测试、和部署。
其中bee工具有个命令是bale
bale 命令
这个命令目前仅限内部使用,具体实现方案未完善,主要用来压缩所有的静态文件变成一个变量申明文件,全部编译到二进制文件里面,用户发布的时候携带静态文件,包括 js、css、img 和 views。最后在启动运行时进行非覆盖式的自解压。
1 2 |
beego.Router("/static/*", &controllers.MainController{},"get:GetAsset") beego.Router("/", &controllers.MainController{},"get:GetHome") |
接下来修改MainController,即default.go文件 加入GetHome和GetAsset两个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import "App/data" func (c *MainController) GetHome() { c.Data["xsrfdata"]=template.HTML(c.XSRFFormHTML()) datas, err := data.Asset("views/index.tpl") // 此行就是读取bindata中的静态文件 if err != nil { //c.String(400, err.Error()) return } c.Ctx.Output.Body(datas) } func (c *MainController) GetAsset() { splat := c.Ctx.Input.Param(":splat") datas, err := data.Asset("static/" + splat) // 此行就是读取bindata中的静态文件 if err != nil { //c.String(400, err.Error()) return } c.Ctx.Output.Header("Content-Type",assetContentType(splat)) //设置正确的Content-Type header c.Ctx.Output.Body(datas) } |
这里蚊子引用了一个函数assetContentType,用来获取静态文件的Content-Type,该函数蚊子放置在了一个新的go文件中
在controllers目录下创建helper.go文件,内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package controllers import ( "path/filepath" "mime" ) var extraMimeTypes = map[string]string{ ".icon": "image-x-icon", ".ttf": "application/x-font-ttf", ".woff": "application/x-font-woff", ".eot": "application/vnd.ms-fontobject", ".svg": "image/svg+xml", ".html": "text/html; charset-utf-8", } func assetContentType(name string) string { ext := filepath.Ext(name) result := mime.TypeByExtension(ext) if result == "" { result = extraMimeTypes[ext] } if result == "" { result = "text/plain; charset=utf-8" } return result } |
到此,整合工作就完成了,接下来,我们就可以编译二进制文件了
首先安装go-bindata包
1 |
go get -u github.com/jteeuwen/go-bindata/... |
然后编译静态文件,以下命令都是在App目录即项目目录中完成
1 |
go-bindata -o data/bindata.go -pkg data -ignore=[.]gitignore -ignore=[.]gitkeep static/... views/... |
接下来编译项目可执行文件
1 |
go build -o App main.go |
然后就可以把创建的App文件移到其他目录并运行起来,然后在浏览器中访问,看看是不是所有css和js都可以加载了。
目前蚊子我也还处在golang初学阶段,如有不准确的地方,还望各位大佬指正。