Введение

Часть 11

От последовательности к рабочему процессу: пусть `.lil` принимает решения

Линейный сценарий идеален, пока ответ всегда один: «сделай A, потом B, потом C». Как только нужно проверить наличие каталога, повторно использовать путь, сохранить результат или остановиться с понятной причиной, перед вами уже рабочий процесс с логикой, а не простой список.

Используйте самый маленький язык автоматизации, который решает задачу

Файл с #lil относится к простому линейному механизму Core: обычные команды выполняются по порядку, и эта простота — достоинство. Он идеален для установочных списков, повторяемой диагностики и коротких процедур.

run — следующий слой. Он добавляет переменные, условия, захват результата, вложенные сценарии и явные правила обработки ошибок. Не превращайте каждый трёхстрочный рецепт в программу; переходите к run, когда сценарию действительно нужно состояние или ветвление.

install run
help run

Переменные дают повторяющимся значениям понятные имена

set root lil-playground задаёт пути понятное имя. Дальше $root, $source и $archive объясняют назначение значений и избавляют от необходимости менять один и тот же текст в пяти местах.

Хорошие имена переменных делают сценарий переносимым. Значения, зависящие от окружения, держите ближе к началу, секреты — снаружи, а несколько ясных переменных почти всегда лучше хитрой сборки строк.

Начните файл с этого
set root lil-playground
set source lil-playground/project
set archive lil-playground/project.zip

Условие проверяет предположение до действия

if dir "$source" — не украшение: проверка не даёт шагу архивации молча работать не с той целью. Условия особенно полезны там, где неверное предположение иначе привело бы к разрушительному или непонятному сбою.

run поддерживает exists, file, dir, empty, eq, ne, ok, fail, command и инверсию через not. Делайте ветки достаточно короткими, чтобы читатель всё ещё понимал, зачем существует каждый путь.

Начните файл с этого
if dir "$source"
    stat "$source"
else
    stop "Project directory is missing"
end

Сохраняйте результат только тогда, когда он нужен дальше

capture name <cmd> выполняет обычную команду lil-terminal и сохраняет её текстовый результат в переменную. Встроенные $last, $status, $cwd и $line дают доступ к основному состоянию выполнения.

Не сохраняйте каждый вывод в переменную только потому, что это возможно. Текстовый результат удобен, когда он невелик и стабилен; структурированные файлы или специализированные команды форматов лучше подходят для данных, которые должны передаваться между инструментами и сохраняться надолго.

Начните файл с этого
capture current pwd -s
if empty "$current"
    stop "Current directory is unavailable"
end

Решите заранее, что означает ошибка

По умолчанию run останавливается после первой ошибки. -k продолжает выполнение и поэтому подходит только там, где шаги действительно независимы. stop позволяет завершить сценарий с понятной причиной.

Незнакомые сценарии сначала запускайте с -n: проверочный режим показывает команды, но не выполняет их. Затем -v может показать полный вывод реального запуска. Предварительный просмотр — не бюрократия, а способ оставить автоматизацию понятной.

run workflow.lil -n
run workflow.lil -v

Делите большие сценарии по ответственности, а не по количеству строк

Сценарий может вызвать run child.lil в том же контексте переменных, поэтому резервное копирование, проверку или развёртывание можно вынести в отдельные файлы и использовать повторно. Не делайте вложенность глубокой и давайте каждому файлу одну роль.

run -p создаёт сжатое представление с контрольной суммой для переноса. Упакованный .lil не является шифрованием: он защищает формат и целостность от случайного редактирования, но не обеспечивает конфиденциальность и не подтверждает авторство.

run -p workflow.lil workflow.packed.lil
run workflow.packed.lil

У автоматизации намеренно меньше полномочий, чем у человека в интерактивном терминале

Интерактивные команды интерфейса в обычных сценариях блокируются, а неинтерактивные команды с повышенными возможностями вроде php и ses требуют явного -x. Автоматическая установка через @command внутри run тоже запрещена.

Это ограничение сделано специально. Воспроизводимый сценарий должен объявлять зависимости от модулей до запуска и не должен неожиданно устанавливать код, запрашивать секрет или уничтожать терминал посреди выполнения.

Сохраните это как сценарий

Сохраните это как workflow.lil, при желании создайте lil-playground/project для успешной ветки и первым делом выполните run workflow.lil -n. Здесь показан главный переход: сценарий проверяет свои предположения до создания архива.

set root lil-playground
set source lil-playground/project
set archive lil-playground/project.zip

if not dir "$root"
    stop "lil-playground is missing"
end

if dir "$source"
    capture current pwd -s
    zip "$source" "$archive" -f
    stat "$archive"
else
    stop "Project directory is missing"
end