Pular para o conteúdo

Recursos incorporados

O pacote embed do Go (Go 1.16+) permite compilar assets estáticos diretamente no binário, para que um único executável possa incluir seu frontend. Esta receita serve o filesystem incorporado por meio do Echo, com um modo live opcional que lê do disco durante o desenvolvimento.

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)
}
}