Keep web/dist/.gitkeep alive across a build

The build deletes it. vite clears outDir (emptyOutDir: true), and that file is
the only reason //go:embed all:dist compiles in a fresh clone - without it a
clone that has not run a frontend build cannot run go build at all.

Found because it happened: a pnpm build during the transcode work removed the
tracked file, and it showed up as a deletion waiting to be committed. A
developer who ran a build and then staged everything would have broken every
clone silently, and the symptom would appear on someone else's machine.

The build now regenerates it, with the explanation in the file itself so the
next person to see it knows what it is for.
This commit is contained in:
mithral 2026-10-12 12:12:02 -04:00
parent 7ed74825e7
commit 3415102d5a
3 changed files with 28 additions and 10 deletions

14
web/dist/.gitkeep vendored
View file

@ -1,10 +1,6 @@
# Keeps web/dist present in a fresh clone. # Generated by scripts/keep-dist.mjs after every build.
# #
# //go:embed all:dist in web/embed.go fails to compile if the directory is # Keeps web/dist present so //go:embed all:dist in web/embed.go compiles
# absent, so a clone with no frontend build could not run `go build` at all. # in a fresh clone, where the frontend has not been built. Without it the
# With this file present the build succeeds and the server logs # server logs "web UI not embedded" and serves the API only, which is the
# "web UI not embedded; run the frontend build to include it", which is the # intended behaviour for a clone that has not run `pnpm build`.
# intended behaviour for someone who only wants the API.
#
# `pnpm build` overwrites dist/ with the real bundle; the Dockerfile builds the
# frontend first and overlays it.

View file

@ -5,7 +5,7 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build && node scripts/keep-dist.mjs",
"preview": "vite preview", "preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json" "check": "svelte-check --tsconfig ./tsconfig.json"
}, },

22
web/scripts/keep-dist.mjs Normal file
View file

@ -0,0 +1,22 @@
// Recreates dist/.gitkeep after a build.
//
// vite clears outDir (emptyOutDir: true in vite.config.ts), which deletes the
// tracked placeholder. Without that file present, //go:embed all:dist in
// web/embed.go fails to compile, so a fresh clone with no frontend build cannot
// run `go build` at all - and a developer who ran `pnpm build` and then
// committed the deletion would silently break every clone.
//
// Writing it here means the file survives a build instead of needing to be
// restored by hand every time.
import { mkdirSync, writeFileSync } from 'node:fs'
mkdirSync('dist', { recursive: true })
writeFileSync(
'dist/.gitkeep',
'# Generated by scripts/keep-dist.mjs after every build.\n' +
'#\n' +
'# Keeps web/dist present so //go:embed all:dist in web/embed.go compiles\n' +
'# in a fresh clone, where the frontend has not been built. Without it the\n' +
'# server logs "web UI not embedded" and serves the API only, which is the\n' +
'# intended behaviour for a clone that has not run `pnpm build`.\n',
)