Go Web 專案打包為一個檔案
使用過 golang 之後,我最喜歡的就是它的打包和交叉編譯
尤其是打包,對於一些後臺服務,打包成一個檔案部署起來很是方便
但是在進行 web 開發時,必然會有靜態資原始檔,部署時就要把靜態目錄和打包後的二進位制檔案都上傳到伺服器。一臺伺服器還好,要是有多臺伺服器上傳靜態檔案也是一件很麻煩的時。
去網上搜了下竟然還真有工具和把靜態檔案打包到二進位制檔案的,原理就是把靜態資源生成一個很大的 go 檔案(把檔案進行字元編碼),然後再引入到專案中,最後實現檔案介面在讀取檔案時候從程式碼中讀取檔案
安裝依賴
下載依賴
go get -u github.com/jteeuwen/go-bindata go get -u github.com/elazarl/go-bindata-assetfs
安裝 go-bindata 到GOPATH/bin
中
go install github.com/jteeuwen/go-bindata/go-bindata
使用
切換到專案路徑下,這裡一個 web 伺服器為例,所有靜態資源放在 www 目錄下
執行go-bindata -o=data/data.go -pkg=data www/...
這句話的意思是把 www 目錄下所有檔案生成為一個 go 檔案,放置到data/data.go
,檔案的包名為data
package main import ( "github.com/elazarl/go-bindata-assetfs" "github.com/tmaize/bindata/data" "net/http" ) func main() { // 重新實現檔案介面 files := assetfs.AssetFS{ Asset:data.Asset, AssetDir:data.AssetDir, AssetInfo: data.AssetInfo, Prefix:"www", // 訪問檔案1.html = > 訪問檔案 www/1.html } // http.Handle("/", http.FileServer(http.Dir("./www"))) http.Handle("/", http.FileServer(&files)) http.ListenAndServe(":8899", nil) }
可以看到引入了生成的data.go
,最終在http.FileServer
中傳入自己實現的檔案系統,使得在訪問檔案時找到對應的字元編碼,再轉換為檔案流
總結
靜態檔案一共 30M,最終打包生成了 19M 的檔案,這也算是一個優點了
使用起來還是挺方便的,每次靜態檔案改動的話在打包前記得重新執行go-bindata
命令
以後在做工具時候可以提供一個 web 介面,不用再搞那麼麻煩的 gui 了