Go 內嵌靜態檔案工具 packr

xfstart07發表於2018-02-09

[Go] Go 內嵌靜態檔案工具 packr

介紹一個簡單實用的 Go 內嵌靜態檔案工具 packr。

安裝

$ go get -u github.com/gobuffalo/packr/...

使用

使用 packr 打包靜態檔案非常簡單,通過建立一個 box.

// templates 是相對路徑,例子是在同一個目錄下
box := packr.NewBox("./templates")

// 以字串的形式獲取靜態檔案
html := box.String("index.html")
fmt.Println("String獲取:", html)

html, err := box.MustString("index.html")
if err != nil {
    log.Fatal(err)
}
fmt.Println("MustString獲取", html)

// 以位元組陣列的形式獲取靜態檔案
htmlByte := box.Bytes("index.html")
fmt.Println("Bytes: ", htmlByte)
// 對應的還有 MustBytes 方法

packr 在查詢檔案時的解析規則:

  • 在二進位制檔案中,在記憶體中查詢檔案
  • 開發時,在本地查詢檔案

在 HTTP 中使用

因為 box 實現了 http.FileSystem 介面,所有可以直接用來提供靜態檔案訪問

package main

import (
    "net/http"

    "github.com/gobuffalo/packr"
)

func main() {
    box := packr.NewBox("./templates")

    http.Handle("/", http.FileServer(box))
    http.ListenAndServe(":3000", nil)
}

使用 gorilla/mux 作為路由庫,mux 也有提供靜態檔案訪問的方式

r := mux.NewRouter()

box := packr.NewBox("./css")
r.PathPrefix("/css").Handler(http.StripPrefix("/css", http.FileServer(box)))

在渲染庫(render)中使用

使用 unrolled/render 庫來渲染資源,在初始化渲染選項中,將靜態檔案加入到 Asset 中。

var boxTemp = packr.NewBox("../templates")
var ren = render.New(render.Options{
    Directory: "templates",
    Asset: func(name string) ([]byte, error) {
       // 返回指定路徑名稱的檔案資源
        return boxTemp.Bytes("index.html"), nil
    },
    AssetNames: func() []string {
       // 靜態檔案的路徑名稱
        return []string{"templates/index.html"}
    },
    Extensions:      []string{".html"},
})

使用

ren.HTML(w, http.StatusOK, "index.html", "")

打包命令

使用命令建立二進位制檔案

packr build 包括了 go build

packr install 包括了 go install

還可以使用 go generate 命令來生成靜態資原始檔(.go),

package main

// 打包靜態檔案命令,生成 packr.go 檔案
//go:generate packr

func main() {
    Run()
}

然後執行命令

go generate && go build

資源

https://github.com/gobuffalo/packr

https://github.com/unrolled/render

https://github.com/gorilla/mux

相關文章