生命不止,繼續 go go go !!!
使用 Go 開發應用的時候,有時會遇到需要讀取靜態資源的情況。比如開發 Web 應用程式,程式需要載入模板檔案產生輸出的 HTML。在程式部署的時候,除了發布應用可執行檔外,還需要發布依賴的靜態資源檔案。這給發布過程添加了一些麻煩。既然發布單獨一個可執行檔是非常簡單的操作,就有人會想辦法把靜態資源檔案打包進 Go 的程式檔案中。
參考地址:
http://fuxiaohei.me/2016/10/1/go-binary-embed-asset.html
文中提到了:
go-bindata
go.rice
esc
本片部落格只會介紹go.rice,其餘的會之後進行介紹的。
What’s an Embedded Resource?
An embedded resource in a application is a file that is included as part of the application. The file is not compiled, but is accessable from the code at run-time. Embedded resources can be any file type.
Languages as JAVA and C# support resources out of box. However, this is not the case for Golang. In order to emebed resource, we need to develop our own solution. Thankfully, there are couple of tools that are doing this for us.
參考地址:
http://blog.ralch.com/tutorial/golang-embedded-resources/ go.rice
go.rice is a Go package that makes working with resources such as html,js,css,images,templates, etc very easy.
github地址:
https://github.com/GeertJohan/go.rice
Star: 1107
擷取:
go get github.com/GeertJohan/go.ricego get github.com/GeertJohan/go.rice/rice
FindBox
funcation to access a particular resource bundler (directory).
The function is finding the correct absolute path for your resource files.
// find a rice.BoxtemplateBox, err := rice.FindBox("your-resource-directory")if err != nil { log.Fatal(err)}// get file contents as stringtmpl, err := templateBox.String("your_asset.tmpl")if err != nil { log.Fatal(err)}
Embedded resource as source code
作為源碼嵌入資源
命令:
rice embed-go
組建檔案:
<directory-name>.rice-box.go
Embedded resource as an archive
appends a resource as a zip file to already built executable
以zip的形式附加到已經存在的可執行檔
Embedded resource as an syso resource
This is experimental method that generates .syso file that is compiled by Go compiler. The following command generates the coff syso resource files per directory:
rice embed-syso
go build -o <program>rice append --exec <program>
echo中使用go.rice
代碼main.go:
package mainimport ( "net/http" "github.com/GeertJohan/go.rice" "github.com/labstack/echo")func main() { e := echo.New() // the file server for rice. "app" is the folder where the files come from. assetHandler := http.FileServer(rice.MustFindBox("app").HTTPBox()) // serves the index.html from rice e.GET("/", echo.WrapHandler(assetHandler)) // servers other static files e.GET("/static/*", echo.WrapHandler(http.StripPrefix("/static/", assetHandler))) e.Logger.Fatal(e.Start(":1323"))}
跟main.go同一級,建立一個檔案夾app,放入檔案file.txt
執行:
rice embed-go
產生了 rice-box.go:
package mainimport ( "github.com/GeertJohan/go.rice/embedded" "time")func init() { // define files file2 := &embedded.EmbeddedFile{ Filename: "file.txt", FileModTime: time.Unix(1511406219, 0), Content: string(""), } // define dirs dir1 := &embedded.EmbeddedDir{ Filename: "", DirModTime: time.Unix(1511406219, 0), ChildFiles: []*embedded.EmbeddedFile{ file2, // "file.txt" }, } // link ChildDirs dir1.ChildDirs = []*embedded.EmbeddedDir{} // register embeddedBox embedded.RegisterEmbeddedBox(`app`, &embedded.EmbeddedBox{ Name: `app`, Time: time.Unix(1511406219, 0), Dirs: map[string]*embedded.EmbeddedDir{ "": dir1, }, Files: map[string]*embedded.EmbeddedFile{ "file.txt": file2, }, })}
執行:
go build
組建檔案:embed_resources.exe
運行embed_resources.exe
刪除app檔案夾下的file.txt
瀏覽器訪問http://localhost:1323/
可以看到file.txt檔案