Golang Echo Labstack为Go嵌入的静态文件提供服务

fnatzsnv  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(101)

我正在使用Go构建一个Web应用程序前端,但是在构建和使用go embed之后,似乎所有静态文件都没有提供,也找不到。我正在使用Echo框架,使用systemctl服务在AWS EC2 Linux上提供Web应用程序。
main.go

  1. type TemplateRenderer struct {
  2. templates *template.Template
  3. }
  4. func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
  5. // Add global methods if data is a map
  6. if viewContext, isMap := data.(map[string]interface{}); isMap {
  7. viewContext["reverse"] = c.Echo().Reverse
  8. }
  9. return t.templates.ExecuteTemplate(w, name, data)
  10. }
  11. //go:embed app/views/*/*.tmpl static/*
  12. var content embed.FS
  13. func main() {
  14. echo.NotFoundHandler = func(c echo.Context) error {
  15. return c.Render(404, "404_not_found", controllers.PageData(c, nil))
  16. }
  17. e := echo.New()
  18. e.Pre(middleware.RemoveTrailingSlash())
  19. e.Use(session.Middleware(sessions.NewCookieStore([]byte("175f678f62fdef4630b40d388d18bddd469925dd5e4c7428af63fcf0b9dc096c"))))
  20. renderer := &TemplateRenderer{
  21. // templates: template.Must(template.New("t").Funcs(template.FuncMap{
  22. templates: template.Must(template.New("t").Funcs(template.FuncMap{
  23. "URLEscape": util.URLEscape,
  24. }).ParseFS(content, "app/views/*/*.tmpl")),
  25. }
  26. e.Renderer = renderer
  27. routes.Routes(e)
  28. e.Use(middleware.Static(""))
  29. e.Use(middleware.Static("static"))
  30. e.Static("/static", "static")
  31. e.Use(middleware.Logger())
  32. e.Use(middleware.Recover())
  33. e.Logger.Fatal(e.Start(":8187"))
  34. }

字符串
如果我使用go build and run the app ./app它工作正常,但如果我使用服务(systemctl start app),所有的静态文件都找不到。似乎我错过了一个步骤,但无法让它工作。提前感谢你。

zynd9foi

zynd9foi1#

您可以考虑使用go-bindatago get -u github.com/go-bindata/go-bindata/...),在“What is the best way to bundle static resources in a Go program?“中提到。
它是一个将任何静态文件转换为Go代码的工具,然后可以包含并编译您的应用程序。这样,您可以将应用程序作为一个单独的二进制文件分发,而无需外部依赖于静态文件。生成的Go代码包含一个用于每个嵌入文件的函数,该函数在调用时返回文件内容作为字节切片。
为静态文件和模板生成Go代码:

  1. go-bindata -o bindata.go static/... app/views/...

字符串
并更新您的main.go以使用生成的bindata.go

  1. package main
  2. import (
  3. "github.com/labstack/echo/v4"
  4. "github.com/labstack/echo/v4/middleware"
  5. )
  6. func main() {
  7. e := echo.New()
  8. e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
  9. Root: "bindata:/static",
  10. Browse: true,
  11. }))
  12. e.GET("/", func(c echo.Context) error {
  13. return c.Blob(200, "text/html; charset=utf-8", Asset("static/index.html"))
  14. })
  15. e.Logger.Fatal(e.Start(":8187"))
  16. }


middleware.StaticWithConfigc.Blob函数用于提供来自bindata.go的嵌入式静态文件。
当应用程序直接运行或通过systemd服务运行时,该设置应该有效。

展开查看全部

相关问题