embed小技巧-動態檔案更新

1112發表於2021-02-22

go1.16 embed可以將檔案嵌入到編譯後的二進位制中,以後釋出一個web程式可以只提供一個二進位制程式,不需要其他檔案,同時避免重複檔案io讀取。

但是在開發時,使用embed後如果修改前端檔案那麼需要重啟GO程式,重新生成embed資料,導致開發過程不方便。

提供一個embed支援動態檔案的小技巧,使用http.Dir和embed.FS混合組合一個新的http.FileSystem,如果當前目錄存在靜態檔案,那麼使用http.Dir返回靜態檔案內容,否則使用embed.FS編譯的內容,這樣既可以使用http.Dir訪問時時的靜態檔案,可以使釋出的二進位制程式使用embed.FS編譯內建的靜態檔案資料。

package main

import (
    "embed"
    "net/http"
)

//go:embed static
var f embed.FS

func main() {
    http.ListenAndServe(":8088", http.FileServer(FileSystems{
        http.Dir("."),
        http.FS(f),
    }))
}

// 組合多個http.FileSystem
type FileSystems []http.FileSystem

func (fs FileSystems) Open(name string) (file http.File, err error) {
    for _, i := range fs {
        // 依次開啟多個http.FileSystem返回一個成功開啟的資料。
        file, err = i.Open(name)
        if err == nil {
            return
        }
    }
    return
}

在程式碼目錄建立一個static目錄,然後裡面建立一個index.html auth.html,啟動程式後就可以使用 localhost:8088/static/index.html 訪問到靜態檔案,在修改檔案後不重啟也會顯示最新的檔案內容。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章