我正在使用Go构建一个Web应用程序前端,但是在构建和使用go embed之后,似乎所有静态文件都没有提供,也找不到。我正在使用Echo框架,使用systemctl服务在AWS EC2 Linux上提供Web应用程序。
main.go
type TemplateRenderer struct {
templates *template.Template
}
func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
// Add global methods if data is a map
if viewContext, isMap := data.(map[string]interface{}); isMap {
viewContext["reverse"] = c.Echo().Reverse
}
return t.templates.ExecuteTemplate(w, name, data)
}
//go:embed app/views/*/*.tmpl static/*
var content embed.FS
func main() {
echo.NotFoundHandler = func(c echo.Context) error {
return c.Render(404, "404_not_found", controllers.PageData(c, nil))
}
e := echo.New()
e.Pre(middleware.RemoveTrailingSlash())
e.Use(session.Middleware(sessions.NewCookieStore([]byte("175f678f62fdef4630b40d388d18bddd469925dd5e4c7428af63fcf0b9dc096c"))))
renderer := &TemplateRenderer{
// templates: template.Must(template.New("t").Funcs(template.FuncMap{
templates: template.Must(template.New("t").Funcs(template.FuncMap{
"URLEscape": util.URLEscape,
}).ParseFS(content, "app/views/*/*.tmpl")),
}
e.Renderer = renderer
routes.Routes(e)
e.Use(middleware.Static(""))
e.Use(middleware.Static("static"))
e.Static("/static", "static")
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Logger.Fatal(e.Start(":8187"))
}
字符串
如果我使用go build and run the app ./app它工作正常,但如果我使用服务(systemctl start app),所有的静态文件都找不到。似乎我错过了一个步骤,但无法让它工作。提前感谢你。
1条答案
按热度按时间zynd9foi1#
您可以考虑使用
go-bindata
(go get -u github.com/go-bindata/go-bindata/...
),在“What is the best way to bundle static resources in a Go program?“中提到。它是一个将任何静态文件转换为Go代码的工具,然后可以包含并编译您的应用程序。这样,您可以将应用程序作为一个单独的二进制文件分发,而无需外部依赖于静态文件。生成的Go代码包含一个用于每个嵌入文件的函数,该函数在调用时返回文件内容作为字节切片。
为静态文件和模板生成Go代码:
字符串
并更新您的
main.go
以使用生成的bindata.go
:型
middleware.StaticWithConfig
和c.Blob
函数用于提供来自bindata.go
的嵌入式静态文件。当应用程序直接运行或通过systemd服务运行时,该设置应该有效。