Aap — это аналог команды make с более гибкими возможностями.
Aap относиться к программному обеспечению,
распространяемому с открытыми исходными
тескстами под GPL.

Установка Aap

Для запуска Aap необходим Python версии 1.5 или выше. Если в вашей
системе нет интерпретатора языка Python, то скачайте его с сайта
www.python.org или установите с дисков вашего дистрибутива.
Установка Aap может быть выполнена в несколько простых шагов. Сначала
необходимо загрузить последнюю версию zip-архива Aap с сайта
www.a-a-p.org. Затем, распаковать во временную
директорию (unzip aap-1.053.zip). После чего, с
привилегиями root’а выполнить `./aap install`. Если на данной машине у вас нет прав root’а, то можно
установить Aap в домашний каталог, для этого просто выполните
`./aap install PREFIX=$HOME`. Для более подробной информации о установке
смотрите соответствующую информацию на официальном сайте.

Управление сайтом

Теперь рассмотрим несколько базовых простых задач. Допустим, вы
разрабатываете простой сайт со статическими HTML файлами и картинками.
Данные файлы находятся у вас на машине и вам необходимо
закачать их на сервер. Листинг 1 показывает Aap скрипт, который решает
эту простую задачу.

Листинг 1. Загрузка файлов на сервер

# Список файлов, которые будут закачены
Files = index.html
info.html
download.html
images/*.png

# Параметр publish указывает куда файлы будут размещены
:attr {publish = scp://my.server.net/html/%file%}
$Files

# Когда выполняется без аргументов, то файлы
закачиваются на сервер

all : publish

Сохраните Листинг 1 под именем ‘main.app’. Этот файл тоже самое, что
‘Makefile’ для команды make, т.е. файл, который будет выполнен по
умолчанию. Запуск `aap` без аргументов выполняет файл ‘main.aap’ в
текущей директории.

Комментарии в Aap начинаются со знака ‘#’ и
продолжаються до конца строки, так же как в Makefile и shell скриптах. В первой строке
переменной Files присваивается значение — список файлов, которые
необходимо закачать. Обратите внимание, что в этом описании не
используются обратные слэши, знаки пунктуации и прочее, как это
делается в Makefile. Данная особенность синтаксиса языка Python: для
определения вложенности используются пробелы, знаки табуляции. В первое
время это может показаться странным, но к данной особенности быстро
привыкаешь.

Строка, начинающаяся с :attr — это каманда Aap. Все Aap команды
начинаются с двоеточия. Команда :attr добавляет атрибут ‘publish’ к
своим аргументам. С свою очередь, атрибут ‘publish’ указывает куда
разместить файл после того, как он будет
закачан. В данном случае используется метод ‘scp://’, т.е. защищенное копирование
(«secure copy»). Так же поддерживаются методы ‘rsync://’ и ‘ftp://’. Последний
аргумент команды :attr — это переменная Files, которая содержит
список файлов. Атрибут назначается каждому элементу списка Files.

Когда Aap запускается без аргументов,
выполняется цель ‘all’. Последняя строка устанавливает, что цель по
умолчанию ‘all’ зависит от цели ‘publish’. Это специальная цель, которая говорит Aap закачать все
элементы указанные в атрибуте ‘publish’.

Теперь можно изменять HTML файлы, добавлять картинки и просматривать
их локально. Всё что вам нужно — это запустить Aap. Aap самостоятельно
вычисляет какие файлы были изменены и загружает именно их, благодаря
сигнатурам («checksum»). Поэтому, даже если вы
восстановите старую версию файла, то все будет работать корректно, а в случае make, необходимо
подправить так же и время последнего изменения файла.

Если вы хотите попробовать этот пример, но у вас нет под рукой
необходимого сервера, то можно заменить параметр ‘publish’ на 
‘file:/tmp/html/%file%’. Тогда, Aap разместит файлы в каталоге
/tmp/html, если такого каталога не существует, то он будет создан
автоматически. 

Примечание: Aap не удаляет файлы на сервере, если они больше не
используются. Вы можете удалить ненужные файлы в ручную. Надеюсь,
автоматическое удаление файлов скоро будет добавлено в Aap.

Список графических файлов из HTML

Для выборки картинок мы использовали выражение ‘images/*.png’, с помощью
которого добавили картинки с расширением png к списку файлов. Данное
решение не столь эффективное, и даже может быть опасно, т.к. будут
закачены все картинки из текущего каталога с указанным расширением
вне зависимости от того имеют они отношение к сайту или нет. 

Как вариант, вы можете указать каждый файл в переменной
Files, чтоприведет к увеличению списка файлов, а так же существует вероятность, что
вы просто забудете включить какие-то файлы. Для решения этой проблемы
Aap предоставляет возможность выделять файлы картинок из самих HTML
файлов. Листинг 2 демонстрирует данную возможность.
get_html_images() функция языка Python, заключённая в обратные кавычки для того, что бы
после выполнения функции, возвращаёмый ею
результат присваивался (а в нашем случае присоединялся к списку) переменной Files. Функция
get_html_images() имеет ограниченные возможности: она работает
только для статичных HTML файлов с картинками, которые имеют
относительные пути.

Листинг 2. Узнаем список графических файлов из HTML

# Список файлов для загрузки
Files = index.html
info.html
download.html
Files += `get_html_images(Files)`

# Параметр publish указывает куда будут размещены файлы
:attr {publish = scp://my.server.net/html/%file%}
$Files

# Когда выполняеться без аргументов, то файлы
закачиваются на сервер

all : publish

Автоматическая генерация HTML файлов

Большинство HTML файлов состоят из «верхней» части, заголовка,
основного содержания и «нижней» части.
Естественно нет необходимости, что бы
абсолютно одинаковые части повторялись в каждом HTML файле,
например, для того что бы изменить пару символов в заголовке вам
необходимо изменить заголовок во всех файлах. Одно из самых простых
решений — это объединять некоторое количество файлов в один, который и
будет размещен на сервере. Листинг 3 показывает решение данной задачи.
Использованы пять частей: «верхняя» часть, заголовок, середина,
содержание и «нижняя» часть. Заголовок и содержание различно для каждой
страницы, но остальные три части одинаковы.

Листинг 3. Генерация HTML файла из пяти частей

Files = index.html
info.html
download.html

:rule %.html : header.part
%_title.part
middle.part
%.part
footer.part
:cat $source >! $target

:update $Files
Files += `get_html_images(Files)`

:attr {publish = scp://my.server.net/html/%file%}
$Files

all : publish

Главное отличие между Листингом 2 и 3 в новой команде :rule. Она
указывает правило по которому цель (HTML файл) зависит от пяти исходных
файлов (частей) и от списка команд для сборки самой цели из исходных файлов.
Символ % используется за место имени файла, так же как это делает символ *. 
Все символы % в этом правиле заменяются на название файла. Например, для
файла index.html: % заменяеться на ‘index’,
соответственно ‘%_title.part’ и ‘%.part’ примут вид ‘index_title.part’ и ‘index.part’.

За командой :rule следует кусок кода, который
выполняется только тогда, когда HTML файл необходимо обновить. 

Команда :cat объединяет файлы, так же как стандартная unix-команда
`cat`. На самом деле она может делать намного больше, например читать файлы с
удаленного адреса. 

HTML файлы необходимо сгенерировать до того, как из них будет взят
список графических файлов, которые они содержат. Что бы это выполнялось
корректно, команда :update выполняется до вызова функции
get_html_images(). HTML файлы обновляются по описанному правилу. 

Теперь, когда у вас есть множество файлов, необходимо разобраться, что
и как делает Aap с ними. Aap работает с зависимостям, примерно так же
как и make: он начинает с цели, которую вы определили в командной строке. Если цель
не обнаружена, то выполняется цель ‘all’. После Aap обнаруживает
зависимости и правила в каждой цели, потом где они указаны до двоеточия. В
основном двоеточие значит — «зависит от»; после
двоеточия идут исходные файлы от которых зависит цель. Каждый исходный файл
анализируется и Aap находит правила, где он указан как цель.
Эти команды выполняются рекурсивно до тех пор,
пока не будут обнаружены все правила. В результате
получается древовидный список зависимостей. Затем
выполняются команды для тех зависимостей, которые необходимо собрать, начиная с конца дерева (последний уровень
вложенности). Вам только необходимо определить то от чего зависит каждая
цель, обо всем остальном позаботиться сам Aap. 

Добавляем временные отметки

Что бы показать гибкость применения Aap, давайте добавим временные
отметки в HTML файлы, что бы пользователи могли наблюдать время
последнего обновления каждой страницы. Для этого
добавим строку ‘@TIMESTAMP@’ в любое место файла ‘footer.part’. Листинг 4 демонстрирует
правило по которому вышеуказанная строка заменяться текущем временем.
Остальное вы можете наблюдать в Листинге 3. Команда :eval высчитывает
выражение языка Python, а string.replace() — это
функция, заменяющая одну строку другой. По этому примеру вы можете использовать любое выражение
языка Python. 

Примечание: HTML страница передается команде :eval с помощью символа |, 
так же как в командной строке. 

Листинг 4. Правило для добавления временных отметок в сгенерированные
HTML файлы

:rule %.html : header.part
%_title.part
middle.part
%.part
footer.part
:print Generating $-target
:cat $source
| :eval string.replace(stdin,
‘@TIMESTAMP@’, _no.DATESTR)
>! $target

Первый раз, когда новое правило будет выполняться, все HTML файлы будут
обновлены. Это произойдет потому, что Aap помнит сигнатуры команд.
Поэтому вы можете не волноваться о полной перегенерации файлов после
изменения команд в ‘main.aap’.

Загрузка с помощью rsync

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

Aap использует rsync, когда атрибут publish начинаеться с ‘rsync://’. По
умолчанию rsync используется поверх SSH-соединения. Это можно изменить
исправив переменную $RSYNC. rsync — это не стандартная
команда unix. Если её нет в вашей системе, то вы
можете заметить еще одну замечательную возможность Aap: вам
автоматически предложат установить rsync:

% aap
Aap: Uploading [‘index.html’] to
rsync://my.server.net/html/index.html
Cannot find package «rsync»!
1. Let Aap attempt installing the package
2. Retry (install it yourself first)
q. Quit
Choice:

Aap имеет встроенный механизм для автоматической установки пакетов при
их необходимости. Эта особенность видна в вышеописанном примере. После
установки rsync, Aap начнет загрузку файлов.

Оставить мнение

Check Also

Как сделать игру. Выбираем движок и пишем клон тех самых «танчиков»

С каждым днем игры становятся все сложнее и навороченнее. Быть инди, а точнее соло-разрабо…