Expand description
Супервизор light dev: горячая перезагрузка приложения с восстановлением
состояния.
Горячая перезагрузка приложения Light: супервизор light dev.
Запускает приложение (копию из target/hot-run/) как дочерний процесс,
следит за исходниками (src/, templates/, Cargo.toml). Две реакции:
- HTML (файлы
*.html) → командаRELOAD_TEMPLATEчерез TCP-сервер DevTools на порту 9229: приложение перечитывает HTML-шаблон с диска и перерисовывает UI без пересборки. При неудачной отправки (app умер, порт недоступен — os error 10061) не триггерим полную пересборку: ждём до 3 с (poll каждые 200 мс), пока TCP снова станет доступен, и повторяемRELOAD_TEMPLATE. - Source (файлы
*.rs/Cargo.toml) → полная пересборка + рестарт: сохраняем состояние (SAVE_STATE), убиваем процесс, перезапускаем.
Race-защита: во время initial build (окно is_starting) изменения не
приводят к немедленным действиям — они накапливаются в pending_html /
pending_source. После закрытия окна (порт 9229 открылся либо прошёл
дедлайн STARTUP_IGNORE) накопленное применяется с приоритетом Source >
Html (пересборка важнее reload). HTML-чнейдж во время initial build
не приводит к пустому restart — это ReloadHtml после старта.
Надёжный мониторинг файлов использует notify::PollWatcher — периодическое
опросование файловой системы, которое работает на любых ФС, включая UNC и
сетевые диски, где нативный watcher (recommended_watcher) события не ловит.
Дебаунс (100 мс для HTML, 500 мс для Source) координирует отдельный поток,
чтобы кратковременные серии событий не запускали много перезагрузок.
Structs§
- DevArgs
- Разобранные параметры команды
light dev. - Rebuild
State Machine - State-machine: решение о реакции на результат фоновой сборки.
- Watch
State - Живое состояние наблюдателя: окно игнорирования при сборке/старте
(
is_starting) и накопленные изменения, которые нужно применить сразу после сброса окна. HTML (runtime-reload) и Source (пересборка) разделяются отдельными флагами: HTML-чнейдж во время initial build не должен приводить к полному рестарту приложения.
Enums§
- Change
Kind - Тип изменения файла для классификации hot-reload.
- Rebuild
Outcome - Результат одной фоновой сборки.
- Watch
Action - Результат обработки одного события наблюдателя: тип реакции (или её отсутствие), либо сигнал, что накопленное изменение требует применения.
Functions§
- bin_
name - Имя бинарника пакета: имя пакета без изменений (cargo не заменяет
-). - build_
info_ path - Путь файла информации о версии фреймворка, от которой зависит hot-build.
- check_
cli_ version_ mismatch - Предупреждение при рассинхроне между установленным CLI и версией
light-fw-core в проекте (сравнение по
major.minor). - classify_
change - Классифицирует путь изменённого файла в
ChangeKind. - clean_
dev_ cache - Удаляет всё, что нужно для полного сброса кэша dev-сборки (ТЗ 0.14.4):
target/hot-build,target/hot-run,.light/state.json,.light/build-info.jsonи артефакты зависимостей текущего пакета изtarget/debug/deps/(только<package>*). Возвращает список удаляемых путей (для логирования и теста). - cleanup_
run_ dir - Удаляет все
.exeвrun_dir, кроме активного (keep). Ошибки молча игнорируются: файл мог быть ещё жив в AV-кэше. - copy_
fresh_ to_ run - Копирует свежий бинарник из
<build_target>/debug/в<run_dir>/<bin>-<ts>.exe. Создаётrun_dir, если её нет. Возвращает путь к копии. - detect_
package_ from_ cwd - Определяет имя пакета, в котором находится пользователь: поднимается вверх
от
cwd, ищет ближайшийCargo.tomlс[package].name; если не найден — используетcargo metadata --no-deps(одиночный пакет → его имя, workspace-член → член, чейmanifest_pathближе всего кcwd). - file_
hash - Хэш содержимого файла (
u64) для дедупликации событий notify. - fresh_
bin_ path - Свежий артефакт после
cargo build --target-dir <build_target>:<build_target>/debug/<package>.exe(Windows) /.exec-без (unix). - handle_
watch_ event - Логика обработки одного события наблюдателя с учётом состояния
WatchState. Отделена от потоков, чтобы юнит-тестить без запуска процесса и файлового watcher’а. - kill_
child - Убивает дочерний процесс и дожидается его завершения.
- parse_
dev_ command - Чистый разбор сырых аргументов командной строки в
DevArgs. - prune_
stale_ run_ exes - Убирает из
run_dirустаревшие копии исполняемых файлов: - read_
fw_ core_ version_ from_ lock - Текущая версия
light-fw-coreвCargo.lockпроекта. ЧитаемCargo.lockнапрямую (без запускаcargo metadata): файл маленький, аcargo metadataиногда долго и может не сработать без сети. - read_
fw_ core_ version_ from_ workspace_ toml - Текущая версия фреймворка в проекте. Порядок:
- request_
reload_ template - Отправляет команду
RELOAD_TEMPLATE\nв TCP-сервер DevTools на127.0.0.1:<port>и закрывает соединение. Приложение перечитывает HTML-шаблон с диска и перерисовывает UI без пересборки. Ошибки не являются фатальными — просто проигнорируются. - request_
reload_ template_ with_ retry - Пытается отправить
RELOAD_TEMPLATE; при неудаче (app умер, порт недоступен) ждёт до [RELOAD_WAIT_MAX], пока TCP снова станет доступен (poll каждые [RELOAD_POLL_INTERVAL]), и повторяет отправку. Не триггерит полную пересборку: HTML-чнейдж — это runtime-reload, не rebuild. - request_
save_ state - Отправляет команду
SAVE_STATE\nв TCP-сервер DevTools на127.0.0.1:<port>и закрывает соединение. Ошибки (сервер не запущен, порт занят) не являются фатальными — просто проигнорируются. - resolve_
package_ root - Определяет корень пакета, который запускает
light dev. - resolve_
startup_ completion - Решает, какое действие применить при закрытии окна
is_starting(порт DevTools открылся либо прошёл дедлайнSTARTUP_IGNORE). Приоритет: Source (полная пересборка) > Html (runtime-reload) > None. - resolve_
workspace_ root - Определяет корень воркспейса через
cargo metadata --no-deps. - run
- Точка входа команды
light dev: запускает дочерний процесс и цикл наблюдения. Возвращает код завершения приложения (неanyhow, чтобы ядро CLI не тягло зависимость, которой нет в его манифесте). - run_
exe_ path - Копия свежего бинарника в
target/hot-run/, от которой и запускается приложение:<run_dir>/<bin>-<ts>.exe. Timestamp (as_millis) делает имя уникальным на каждый swap; старые копии чистятсяcleanup_run_dir. - save_
build_ info - Читает и парсит
build-info.json. Повреждённый файл —None(перезапишется), отсутствующий файл —None(первая сборка: кэш не инвалидируется, просто фиксируем текущую версию). Ошибки записи игнорируются: при неудаче запись кэш не сломает, но следующая сборка будет повторять попытку записи. - state_
file_ path - Путь файла состояния относительно
root(по умолчанию.light/state.json; переопределяется переменной окруженияLIGHT_STATE_FILE). - wait_
port_ available - Ожидает восстановления TCP-доступа к порту
portв течениеmax(poll каждыеinterval). Возвращаетtrue, если порт принял соединение, иначеfalse. Используется для повторной отправкиRELOAD_TEMPLATEпосле неудачного (например, app умер) — без полной пересборки. - watch_
paths - Строит список путей для наблюдения:
src/иtemplates/(только если существуют) плюсCargo.toml(если есть). - window_
file_ path - Путь файла геометрии окна относительно
root(по умолчанию.light/window.json; переопределяетсяLIGHT_WINDOW_FILE). Совпадает с путём, который читает/пишет окно приложения (light-fw-core::window).