跳转到内容

嵌入资源

Go 的 embed 包(Go 1.16+)允许你把静态资源直接编译进二进制文件,因此单个可执行文件即可携带前端。 此示例通过 Echo 提供嵌入式文件系统,并支持一个可选的 live 模式,在开发期间从磁盘读取。

package main
import (
"context"
"embed"
"io/fs"
"log"
"net/http"
"os"
"github.com/labstack/echo/v5"
)
//go:embed app
var embededFiles embed.FS
func getFileSystem(useOS bool) http.FileSystem {
if useOS {
log.Print("using live mode")
return http.FS(os.DirFS("app"))
}
log.Print("using embed mode")
fsys, err := fs.Sub(embededFiles, "app")
if err != nil {
panic(err)
}
return http.FS(fsys)
}
func main() {
e := echo.New()
useOS := len(os.Args) > 1 && os.Args[1] == "live"
assetHandler := http.FileServer(getFileSystem(useOS))
e.GET("/", echo.WrapHandler(assetHandler))
e.GET("/static/*", echo.WrapHandler(http.StripPrefix("/static/", assetHandler)))
sc := echo.StartConfig{Address: ":1323"}
if err := sc.Start(context.Background(), e); err != nil {
e.Logger.Error("failed to start server", "error", err)
}
}