fix(make): пересобирать изменившийся фронтенд в make run

Цель run зависела только от backend, а статика фронтенда попадает в бинарник
через go:embed из backend/static, который обновляла лишь цель frontend. Поэтому
make run пересобирал Go-код со старым UI.

- run теперь зависит от frontend backend;
- frontend стала инкрементальной: npm ci только при изменении package.json/
  package-lock.json, npm run build и копирование в backend/static — только когда
  исходники или конфиги новее, чем backend/static/index.html (он же stamp);
- проверки вынесены в shell-recipe, т.к. имена SvelteKit-роутов вида (app)
  ломают разбор имён файлов в make.
This commit is contained in:
iu
2026-10-16 13:26:43 +03:00
parent 14db79632a
commit 28e3d4676f
2 changed files with 44 additions and 6 deletions
+38 -4
View File
@@ -32,10 +32,44 @@ help:
@echo "Available targets:" @echo "Available targets:"
@grep -hE '^[a-zA-Z0-9_-]+:' $(MAKEFILE_LIST) | cut -d: -f1 | sed 's/^/ /' @grep -hE '^[a-zA-Z0-9_-]+:' $(MAKEFILE_LIST) | cut -d: -f1 | sed 's/^/ /'
# Frontend sources whose changes must trigger a rebuild. `backend/static/index.html`
# doubles as the build stamp, so a clean clone or `make clean` (which empties
# backend/static) forces the next build to regenerate.
FRONTEND_OUT := backend/static/index.html
# `npm ci` is only needed when the manifest/lockfile change.
FRONTEND_DEPS_STAMP := frontend/node_modules/.install-stamp
# Build the SvelteKit bundle and copy it into backend/static (embedded via
# go:embed). Incremental: recompile only when frontend sources are newer than the
# embedded bundle. Paths are checked from the recipe (not as make prerequisites)
# because SvelteKit route names like `(app)` break make's filename parsing.
frontend: frontend:
cd frontend && npm ci && npm run build @set -e; \
rm -rf backend/static/* if [ ! -f $(FRONTEND_DEPS_STAMP) ] \
cp -r frontend/build/* backend/static/ || [ frontend/package.json -nt $(FRONTEND_DEPS_STAMP) ] \
|| [ frontend/package-lock.json -nt $(FRONTEND_DEPS_STAMP) ]; then \
echo '> cd frontend && npm ci'; \
cd frontend && npm ci; \
touch node_modules/.install-stamp; \
cd ..; \
fi; \
if [ ! -f $(FRONTEND_OUT) ] \
|| [ -n "$$(find frontend/src frontend/static -newer $(FRONTEND_OUT) -print -quit)" ] \
|| [ frontend/package.json -nt $(FRONTEND_OUT) ] \
|| [ frontend/package-lock.json -nt $(FRONTEND_OUT) ] \
|| [ frontend/svelte.config.js -nt $(FRONTEND_OUT) ] \
|| [ frontend/vite.config.ts -nt $(FRONTEND_OUT) ] \
|| [ frontend/tailwind.config.ts -nt $(FRONTEND_OUT) ] \
|| [ frontend/tsconfig.json -nt $(FRONTEND_OUT) ]; then \
echo '> cd frontend && npm run build'; \
cd frontend && npm run build; \
cd ..; \
rm -rf backend/static/*; \
cp -r frontend/build/* backend/static/; \
else \
echo 'frontend: up to date'; \
fi
backend: backend:
mkdir -p bin mkdir -p bin
@@ -87,7 +121,7 @@ build-release: frontend
cp bin/galo bin/galo-$(VERSION) cp bin/galo bin/galo-$(VERSION)
@echo "release: bin/galo-$(VERSION)" @echo "release: bin/galo-$(VERSION)"
run: backend run: frontend backend
./bin/galo ./bin/galo
migrate: migrate:
+6 -2
View File
@@ -125,7 +125,7 @@ make build # frontend -> backend/static -> go:embed -> bin/galo
Отдельные шаги: Отдельные шаги:
```bash ```bash
make frontend # npm ci && npm run build, копирует статику в backend/static make frontend # npm run build, копирует статику в backend/static (инкрементально)
make backend # CGO_ENABLED=0 go build -tags nodynamic -o bin/galo make backend # CGO_ENABLED=0 go build -tags nodynamic -o bin/galo
``` ```
@@ -133,6 +133,10 @@ make backend # CGO_ENABLED=0 go build -tags nodynamic -o bin/galo
> транспилированный в Go libwebp вместо динамической загрузки через purego, > транспилированный в Go libwebp вместо динамической загрузки через purego,
> благодаря чему бинарник остаётся полностью статическим. > благодаря чему бинарник остаётся полностью статическим.
`make frontend` собирает только при изменении исходников `frontend/`; `npm ci`
запускается лишь когда менялись `package.json`/`package-lock.json`. `make run`
и `make build` учитывают это и не пересобирают неизменившийся фронтенд.
Проверка: Проверка:
```bash ```bash
@@ -151,7 +155,7 @@ make migrate # go run ./cmd/migrate — применяет up-миграци
## Локальный запуск ## Локальный запуск
```bash ```bash
make run # соберёт backend и запустит ./bin/galo make run # доберёт изменившийся фронтенд, соберёт backend и запустит ./bin/galo
# или напрямую: # или напрямую:
./bin/galo ./bin/galo
``` ```