remove concept of prod and dev assets

instead always do the "prod" thing, but use entr for restarting the
server for all assets
This commit is contained in:
sentriz
2019-07-08 13:36:26 +01:00
parent b44b0d8720
commit ba2f835c22
11 changed files with 59 additions and 106 deletions

View File

@@ -1,17 +1,8 @@
#!/bin/sh #!/bin/sh
source ./_build_vars source ./_build_vars
find server/assets/ \ ./_do_gen_assets
-type f \
-exec go run \
cmd/gonicembed/main.go \
-out-path server/assets_bytes.go \
-tag-list embed \
-package-name server \
-assets-var-name AssetBytes \
-asset-path-prefix server/assets/ \
{} +
go build \ go build \
-o gonic \ -o gonic \
-tags "$(tr '\n' ' ' < _build_tags) embed" \ -tags "$(tr '\n' ' ' < _build_tags)" \
cmd/gonic/main.go cmd/gonic/main.go

11
_do_gen_assets Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/sh
find server/assets/ \
-type f \
-exec go run \
cmd/gonicembed/main.go \
-out-path server/assets_bytes.go \
-package-name server \
-assets-var-name assetBytes \
-asset-path-prefix server/assets/ \
{} +

View File

@@ -1,6 +1,7 @@
#!/bin/sh #!/bin/sh
source ./_build_vars source ./_build_vars
./_do_gen_assets
go run \ go run \
-tags "$(tr '\n' ' ' < _build_tags)" \ -tags "$(tr '\n' ' ' < _build_tags)" \
cmd/gonic/main.go \ cmd/gonic/main.go \

3
_do_run_server_live Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/sh
find server/assets/ | entr -r ./_do_run_server $@

View File

@@ -54,7 +54,6 @@ func main() {
db, db,
*musicPath, *musicPath,
*listenAddr, *listenAddr,
"server/assets/",
) )
err = s.SetupAdmin() err = s.SetupAdmin()
if err != nil { if err != nil {

View File

@@ -21,7 +21,7 @@ const (
fileHeader = `// file generated with embed tool fileHeader = `// file generated with embed tool
// do not edit // do not edit
// +build %s // %s
package %s package %s
import "time" import "time"
@@ -82,6 +82,9 @@ func processAssets(c *config, files []string) error {
if err != nil { if err != nil {
return errors.Wrap(err, "creating out path") return errors.Wrap(err, "creating out path")
} }
if c.tagList != "" {
c.tagList = fmt.Sprintf("+build %s", c.tagList)
}
outWriter.Write([]byte(fmt.Sprintf(fileHeader, outWriter.Write([]byte(fmt.Sprintf(fileHeader,
c.tagList, c.tagList,
c.packageName, c.packageName,

27
server/assets_getters.go Normal file
View File

@@ -0,0 +1,27 @@
package server
import (
"bytes"
"errors"
"io"
"time"
)
var errAssetNotFound = errors.New("asset not found")
func findAsset(path string) (time.Time, io.ReadSeeker, error) {
asset, ok := assetBytes[path]
if !ok {
return time.Time{}, nil, errAssetNotFound
}
reader := bytes.NewReader(asset.Bytes)
return asset.ModTime, reader, nil
}
func findAssetBytes(path string) (time.Time, []byte, error) {
asset, ok := assetBytes[path]
if !ok {
return time.Time{}, nil, errAssetNotFound
}
return asset.ModTime, asset.Bytes, nil
}

View File

@@ -1,39 +0,0 @@
// +build !embed
package server
import (
"io"
"io/ioutil"
"os"
"path/filepath"
"time"
"github.com/pkg/errors"
)
func (a *Assets) Find(path string) (time.Time, io.ReadSeeker, error) {
fullPath := filepath.Join(a.BasePath, path)
info, err := os.Stat(fullPath)
if err != nil {
return time.Time{}, nil, errors.Wrap(err, "statting asset")
}
file, err := os.Open(fullPath)
if err != nil {
return time.Time{}, nil, errors.Wrapf(ErrAssetNotFound, "%v", err)
}
return info.ModTime(), file, nil
}
func (a *Assets) FindBytes(path string) (time.Time, []byte, error) {
fullPath := filepath.Join(a.BasePath, path)
info, err := os.Stat(fullPath)
if err != nil {
return time.Time{}, nil, errors.Wrap(err, "statting asset")
}
file, err := ioutil.ReadFile(fullPath)
if err != nil {
return time.Time{}, nil, errors.Wrapf(ErrAssetNotFound, "%v", err)
}
return info.ModTime(), file, nil
}

View File

@@ -1,26 +0,0 @@
// +build embed
package server
import (
"bytes"
"io"
"time"
)
func (_ *Assets) Find(path string) (time.Time, io.ReadSeeker, error) {
asset, ok := AssetBytes[path]
if !ok {
return time.Time{}, nil, ErrAssetNotFound
}
reader := bytes.NewReader(asset.Bytes)
return asset.ModTime, reader, nil
}
func (_ *Assets) FindBytes(path string) (time.Time, []byte, error) {
asset, ok := AssetBytes[path]
if !ok {
return time.Time{}, nil, ErrAssetNotFound
}
return asset.ModTime, asset.Bytes, nil
}

View File

@@ -1,7 +1,6 @@
package server package server
import ( import (
"errors"
"net/http" "net/http"
"time" "time"
@@ -11,7 +10,6 @@ import (
type Server struct { type Server struct {
mux *http.ServeMux mux *http.ServeMux
assets *Assets
*handler.Controller *handler.Controller
*http.Server *http.Server
} }
@@ -20,7 +18,6 @@ func New(
db *db.DB, db *db.DB,
musicPath string, musicPath string,
listenAddr string, listenAddr string,
assetPath string,
) *Server { ) *Server {
mux := http.NewServeMux() mux := http.NewServeMux()
server := &http.Server{ server := &http.Server{
@@ -34,23 +31,13 @@ func New(
DB: db, DB: db,
MusicPath: musicPath, MusicPath: musicPath,
} }
assets := &Assets{
BasePath: assetPath,
}
return &Server{ return &Server{
mux: mux, mux: mux,
assets: assets,
Server: server, Server: server,
Controller: controller, Controller: controller,
} }
} }
var ErrAssetNotFound = errors.New("asset not found")
type Assets struct {
BasePath string
}
type middleware func(next http.HandlerFunc) http.HandlerFunc type middleware func(next http.HandlerFunc) http.HandlerFunc
func newChain(wares ...middleware) middleware { func newChain(wares ...middleware) middleware {

View File

@@ -44,21 +44,20 @@ var (
type templateMap map[string]*template.Template type templateMap map[string]*template.Template
func parseFromPaths(assets *Assets, base *template.Template, func parseFromPaths(base *template.Template, paths []string, dest templateMap) error {
paths []string, destination templateMap) error {
for _, path := range paths { for _, path := range paths {
_, tmplBytes, err := assets.FindBytes(path) _, tmplBytes, err := findAssetBytes(path)
if err != nil { if err != nil {
return errors.Wrapf(err, "getting template %q from assets", path) return errors.Wrapf(err, "getting template %q from assets", path)
} }
tmplStr := string(tmplBytes) tmplStr := string(tmplBytes)
if destination != nil { if dest != nil {
// we have a destination. meaning this template is a page. // we have a destination. meaning this template is a page.
// instead of parsing as usual, we need to clone and add to the // instead of parsing as usual, we need to clone and add to the
// template map // template map
clone := template.Must(base.Clone()) clone := template.Must(base.Clone())
tmplKey := filepath.Base(path) tmplKey := filepath.Base(path)
destination[tmplKey] = template.Must(clone.Parse(tmplStr)) dest[tmplKey] = template.Must(clone.Parse(tmplStr))
continue continue
} }
_ = template.Must(base.Parse(tmplStr)) _ = template.Must(base.Parse(tmplStr))
@@ -66,9 +65,9 @@ func parseFromPaths(assets *Assets, base *template.Template,
return nil return nil
} }
func staticHandler(assets *Assets, path string) http.HandlerFunc { func staticHandler(path string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
modTime, reader, err := assets.Find(path) modTime, reader, err := findAsset(path)
if err != nil { if err != nil {
log.Printf("error getting file %q from assets: %v\n", path, err) log.Printf("error getting file %q from assets: %v\n", path, err)
http.Redirect(w, r, "/", http.StatusSeeOther) http.Redirect(w, r, "/", http.StatusSeeOther)
@@ -94,17 +93,14 @@ func (s *Server) SetupAdmin() error {
Funcs(template.FuncMap{ Funcs(template.FuncMap{
"humanDate": humanize.Time, "humanDate": humanize.Time,
}) })
if err := parseFromPaths( if err := parseFromPaths(tmplBase, partialsPaths, nil); err != nil {
s.assets, tmplBase, partialsPaths, nil); err != nil {
return errors.Wrap(err, "parsing template partials") return errors.Wrap(err, "parsing template partials")
} }
if err := parseFromPaths( if err := parseFromPaths(tmplBase, layoutPaths, nil); err != nil {
s.assets, tmplBase, layoutPaths, nil); err != nil {
return errors.Wrap(err, "parsing template layouts") return errors.Wrap(err, "parsing template layouts")
} }
s.Templates = make(templateMap) s.Templates = make(templateMap)
if err := parseFromPaths( if err := parseFromPaths(tmplBase, pagePaths, s.Templates); err != nil {
s.assets, tmplBase, pagePaths, s.Templates); err != nil {
return errors.Wrap(err, "parsing template pages for destination") return errors.Wrap(err, "parsing template pages for destination")
} }
// //
@@ -123,7 +119,7 @@ func (s *Server) SetupAdmin() error {
// begin static server // begin static server
for _, path := range append(imagePaths, stylesheetPaths...) { for _, path := range append(imagePaths, stylesheetPaths...) {
fullPath := filepath.Join("/admin/static", path) fullPath := filepath.Join("/admin/static", path)
s.mux.HandleFunc(fullPath, staticHandler(s.assets, path)) s.mux.HandleFunc(fullPath, staticHandler(path))
} }
// begin public routes (creates new session) // begin public routes (creates new session)
s.mux.HandleFunc("/admin/login", withPublicWare(s.ServeLogin)) s.mux.HandleFunc("/admin/login", withPublicWare(s.ServeLogin))