fix: move embed to repo root; make build sequential

- Move embed_prod.go/embed_dev.go out of cmd/wotra/ into root-level
  assets_prod.go / assets_dev.go (package assets). go:embed paths
  must be relative to the source file; cmd/wotra/ cannot reach
  ../../web/build.
- Update cmd/wotra/main.go to import the root assets package.
- Change mise.toml build task from parallel depends to sequential
  shell commands (build:web then build:go) so the frontend is always
  compiled before the Go embed runs.
This commit is contained in:
2026-05-01 09:39:52 +02:00
parent a8a4ea0d4f
commit 31535e944d
6 changed files with 38 additions and 39 deletions

9
assets_dev.go Normal file
View File

@@ -0,0 +1,9 @@
// assets_dev.go — used in non-production builds (no web/build required)
//go:build !production
package assets
import "io/fs"
// FS is nil in dev mode; the router skips static file serving.
var FS fs.FS

21
assets_prod.go Normal file
View File

@@ -0,0 +1,21 @@
// assets_prod.go — used in production builds (requires web/build to exist)
//go:build production
package assets
import (
"embed"
"io/fs"
)
//go:embed all:web/build
var embeddedWeb embed.FS
// FS is the sub-filesystem rooted at web/build.
var FS fs.FS = func() fs.FS {
sub, err := fs.Sub(embeddedWeb, "web/build")
if err != nil {
panic(err)
}
return sub
}()

View File

@@ -1,9 +0,0 @@
// embed_dev.go — used in non-production builds (no web/build directory required)
//go:build !production
package main
import "io/fs"
// webFS is nil in dev mode; the router will skip static file serving.
var webFS fs.FS

View File

@@ -1,20 +0,0 @@
// embed_prod.go — used in production builds (requires web/build to exist)
//go:build production
package main
import (
"embed"
"io/fs"
)
//go:embed all:../../web/build
var embeddedWeb embed.FS
var webFS fs.FS = func() fs.FS {
sub, err := fs.Sub(embeddedWeb, "web/build")
if err != nil {
panic(err)
}
return sub
}()

View File

@@ -2,7 +2,6 @@ package main
import (
"context"
"io/fs"
"log/slog"
"net/http"
"os"
@@ -10,6 +9,7 @@ import (
"syscall"
"time"
assets "github.com/wotra/wotra"
"github.com/wotra/wotra/internal/config"
"github.com/wotra/wotra/internal/handler"
"github.com/wotra/wotra/internal/service"
@@ -56,13 +56,8 @@ func main() {
defer cancel()
go runMidnightGuard(ctx, entrySvc)
// Static SPA files (embedded or from disk for dev)
var staticFS fs.FS
if webFS != nil {
staticFS = webFS
}
router := handler.NewRouter(cfg.AuthToken, entrySvc, daySvc, settingsSvc, weekSvc, syncStore, entryStore, adjustmentStore, settingsStore, staticFS)
// Static SPA files (embedded or nil for dev)
router := handler.NewRouter(cfg.AuthToken, entrySvc, daySvc, settingsSvc, weekSvc, syncStore, entryStore, adjustmentStore, settingsStore, assets.FS)
srv := &http.Server{
Addr: ":" + cfg.Port,

View File

@@ -10,8 +10,11 @@ DB_PATH = "wotra.db"
TZ = "UTC"
[tasks.build]
description = "Build production single binary (web + Go)"
depends = ["build:web", "build:go"]
description = "Build production single binary (web + Go, sequential)"
run = """
mise run build:web
mise run build:go
"""
[tasks."build:web"]
description = "Build Svelte frontend"