Wake
Экспериментальный инструмент запуска сборки, учитывающий особенности Wails: он выполняет существующие Taskfile вашего проекта, ускоряет инкрементальные сборки, предоставляет структурированный вывод и по умолчанию запускает задачи параллельно.
Wake — экспериментальное альтернативное средство запуска сборки для wails3. Оно читает те же Taskfile.yml, которые уже есть в вашем проекте, — с тем же синтаксисом задач, зависимостей, переменных, шаблонов, включений и пространств имён платформ — и выполняет их с помощью исполнителя, учитывающего особенности Wails, а не универсальной среды выполнения Task.
Цель состоит не в том, чтобы заменить Task, а в том, чтобы предоставить средство запуска, специально созданное для фактического процесса сборки проектов Wails, с семантикой, выводом и настройками по умолчанию, согласованными с остальной частью CLI wails3. Если вы используете только Wake, ваши Taskfile не изменятся.
Зачем нужен Wake
И Wake, и среда выполнения Task встроены в wails3 — ни для одного из них не требуется устанавливать отдельный исполняемый файл. Разница в том, что Wake понимает предметную область. Универсальное средство запуска выполняет перечисленные в Taskfile шаги в указанном порядке. Wake знает, что в действительности представляет собой сборка Wails: пакет фронтенда встраивается в исполняемый файл, этот файл упаковывается в артефакты для конкретных платформ, а параллельно создаются значки и привязки. Благодаря этому Wake оптимизирует сборку способами, недоступными универсальному средству запуска.
-
Он выполняет только действительно необходимую для сборки работу. Wake самостоятельно отслеживает фактические входные и выходные данные каждого шага. Для сборки Go это граф модулей и результаты шагов, от которых она зависит. Поэтому, если ничего значимого не изменилось, Wake полностью пропускает компилятор и компоновщик, а не запускает их повторно. Универсальное средство запуска может пропустить шаг, только если в Taskfile заранее и точно перечислены отслеживаемые файлы; Wake определяет их на основе уже имеющихся у него сведений о сборке. Повторная сборка без изменений занимает примерно ~20 мс (Wake) против ~316 мс (Task). Полная сборка с нуля занимает одинаковое реальное время: основная его часть приходится на
npm install, Vite и компилятор Go. -
Он знает, какие шаги можно выполнять одновременно. Поскольку Wake понимает, какие шаги независимы друг от друга, по умолчанию он выполняет их параллельно, а итоговая строка показывает достигнутое ускорение. Отключите параллельное выполнение с помощью
WAKE_SERIAL=true, если чередующийся вывод соседних шагов затрудняет анализ проблемы. -
Структурированный вывод под управлением wails3. Wake формирует вывод через собственный модуль отчётов wails3: по одной строке на каждый запланированный шаг, состояние в реальном времени, цветная разбивка по этапам в конце и активные ссылки
file:lineв панелях ошибок. В режимеNO_COLORи средах без TTY (например, в журналах CI) представление корректно упрощается. -
Встроен и может развиваться вместе с Wails. Поскольку Wake является частью
wails3, а не сторонним инструментом, новые возможности сборки можно добавлять непосредственно — не нужно ждать, пока их реализует отдельный проект. Это также позволит выполнять кроссплатформенные сценарии и инструменты нативно там, где сегодня Taskfile обращается к исполняемому файлуwails3через оболочку, создавая отдельный процесс для каждого вызова. Выполнение этой работы внутри процесса снижает накладные расходы и открывает возможности для дальнейшего ускорения.
Включение Wake
Wake полностью управляется переменной окружения WAILS_USE_WAKE=true. Если она не задана или имеет значение, отличное от true, каждая команда wails3 использует встроенную среду выполнения Task точно так же, как и раньше.
# Default: Task runtime, no Wake involvement
wails3 build
# Opt in: Wake drives build / package / sign / task <name>
WAILS_USE_WAKE=true wails3 build
WAILS_USE_WAKE=true wails3 package
WAILS_USE_WAKE=true wails3 task <some-task-name>
Этот флаг применяется к wails3 build, wails3 package, wails3 sign и wails3 task <name>. На wails3 dev он пока не влияет: средство отслеживания изменений в режиме разработки по-прежнему использует собственный конвейер.
Многоуровневые локальные переопределения
Wake поддерживает базовый Taskfile и локальные переопределения. Поместите файл рядом с Taskfile.yml, и его определения получат приоритет:
| Файл | Назначение | Приоритет |
|---|---|---|
Taskfile.yml |
базовый, хранится в репозитории | самый низкий |
Taskfile.override.yml / .yaml |
общие для команды переопределения, хранятся в репозитории | средний |
Taskfile.local.yml / .yaml |
личные, обычно игнорируются Git | самый высокий |
Правила слияния (локальные значения имеют приоритет):
- Задача с тем же именем переопределяет базовую задачу. Если в переопределении заданы поля-списки (
cmds,deps,sources,generates,platforms,status,preconditions,aliases), они заменяют соответствующие базовые поля; поля, отсутствующие в переопределении, сохраняются из базовой задачи. envиvarsобъединяются по ключам, причём при совпадении ключей приоритет имеет переопределение.- Задача, присутствующая только в файле переопределения, добавляется.
Например, если хранящийся в репозитории Taskfile.yml выполняет сборку с флагами разработки, но на вашем компьютере всегда должна выполняться производственная сборка:
# Taskfile.local.yml (git-ignored, yours)
tasks:
build:
cmds:
- go build -tags production -o bin/app .
smoke:
cmds:
- ./bin/app --selftestТеперь build выполняет вашу команду производственной сборки, а smoke становится доступна — при этом хранящийся в репозитории Taskfile не изменяется.
Автоматический переход на резервный механизм
Если Wake встречает функцию Taskfile, которую не поддерживает, он передаёт весь запуск встроенной среде выполнения Task. Сейчас такой переход вызывают следующие функции:
dotenvна уровне Taskfile- режимы
output, отличные отinterleaved - блок
requires interval(на уровне Taskfile или задачи)- режимы
run, отличные отalways shortв задачеdeferв задаче
Переменные окружения
| Переменная | Действие |
|---|---|
WAILS_USE_WAKE |
true включает Wake для поддерживающих маршрутизацию команд wails3; при любом другом значении используется среда выполнения Task |
WAILS_NO_OVERRIDES |
true отключает обнаружение Taskfile.local.* / .override.* (для детерминированных сборок) |
WAKE_VERBOSE |
Выводить stdout/stderr подпроцесса в реальном времени, а не сохранять их для отображения только при сбое |
WAKE_SILENT |
Полностью подавлять вывод задачи |
WAKE_SERIAL |
true отключает параллельный веерный запуск deps: (по умолчанию используется параллельный запуск) |
WAKE_FORCE |
true обходит все кеши для действительно чистой повторной сборки |
WAKE_DEBUG |
Записывать в журнал внутренние данные механизма разрешения (DAG, зависимости, ссылки на переменные, маршрутизацию выполнения) |
WAKE_NOTICE |
off, чтобы отключить уведомление «wake (experimental)» при каждом запуске |
Кеш сборки находится в .wake/cache.json (Task использует .task/).
Обратная связь
Wake — эксперимент, и от ваших отзывов зависит его дальнейшее развитие. Если вы попробуете Wake, расскажите нам, стал ли он быстрее и понятнее и возникли ли какие-либо неполадки. Самые полезные отчёты содержат сведения о том, что вы запускали, какого результата ожидали и что произошло на самом деле. Оставьте отзыв в обсуждении Wake.