josephspurrier/gowebapp

Embed Files in Go 1.16

Closed this issue · 4 comments

How to embed template and static folder using this app's templating system and view?

Many thanks

You should add this to a Go file in the template folder to allow including templates during build time:

//go:embed */*.tmpl
var Assets embed.FS

You'll then have to update vendor/app/shared/view/view.go so it loads the assets like this instead of using ParseFiles.

// Parse the template.
tmpl, err := template.New(path.Base(templatePath)).Funcs(fm).ParseFS(Assets, templatePath)
if err != nil {
	return "", err
}

// Execute the template.
err = tmpl.Execute(buf, data)
if err != nil {
	return "", err
}

Here's my try

template/embed.go

package template

import "embed"

//go:embed */*.tmpl

var Assets embed.FS

app\shared\view\view.go

import (
...
	"path/filepath"
	tmpl "github.com/josephspurrier/gowebapp/template"
)
...
	//templates, err := template.New(v.Name).Funcs(pc).ParseFiles(templateList...)
	templates, err := template.New(filepath.Base(v.Name+".tmpl")).Funcs(pc).ParseFS(tmpl.Assets, "*/*.tmpl")


...
	//err := tc.Funcs(pc).ExecuteTemplate(w, rootTemplate+"."+v.Extension, v.Vars)
	err := tc.Execute(w, v.Vars)

Compiling was successful but the web is now blank (nothing shown)

You need to update the embedded comment to: //go:embed *.tmpl */*.tmpl. You need to go back to using the templateList... and then you need to update the templateLIst for loop to just append the extensions instead of the full path.

I've got a branch working with embedded templates: 3603a3b