リソースの埋め込み
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 appvar 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) }}