Flash: AIR + Embedded - одновременная разработка во FlashDevelop


Часто случается, что код actionscript, который использовался при разработке браузерного приложения, нужно использовать в настольном (AIR) - и наоборот.

Данная статья описывает подход, при котором можно быстро расширить цели развёртывания проекта - или разрабатывать приложения AIR и Embedded одновременно - в среде FlashDevelop.

Основной помехой для этого будет разница в типе базового класса - для AIR это WindowedApplication, а для браузерной флешки - Application.

Один из возможных (и, как мне показалось, довольно-таки удобных) способов обойти это несоответствие - это вести два различных проекта с единой кодовой базой.

Подробнее о том, как это можно сделать во FlashDevelop:

1) Создаём embedded-проект:

Creating Flex application in FlashDevelop

При этом нужно учесть, что каталог, в котором этот проект будет располагаться, будет впоследствии содержать ещё один проект (AIR) - и следует дать ему какое-то обобщающее, осмысленное имя (на скриншоте, для примера, это - MultiDeployProject). Также не забудьте снять галочку Create directory for the project

2) Переименовываем файл Main.mxml так, чтобы его имя однозначно соответствовало emdebbed-проекту. Например, embeddedMain.mxml.

3) Нужно обязательно разделить каталоги bin для embedded и для AIR - иначе в AIR-установщик попадёт много ненужных и лишних файлов. Поэтому на этом шаге нужно переименовать каталог bin так, чтобы он однозначно соответствовал embedded-приложению - например, embeddedBin. Чтобы код скомпилировался именно в этот каталог, зайдём в свойства проекта и выставим корректный путь для Output file:

Output file в свойствах embedded-проекта

4) Создаём AIR-проект:

Creating AIR application in FlashDevelop

Указываем для него тот же каталог, в котором мы расположили предыдущий проект.

На запрос подтверждения смело отвечаем "Yes":

FlashDevelop single catalog for multiple projects confirmation

5) (необязательно) Переименуем каталог bin так, чтобы он однозначно соответствовал AIR-приложению - например, airBin. Чтобы код скомпилировался именно в этот каталог, в свойствах AIR-проекта выставим корректный путь для Output file:

Output file в свойствах AIR-проекта

6) (необязательно) Переименовываем файл Main.mxml так, чтобы его имя однозначно соответствовало AIR-проекту. Например, desktopMain.mxml.

7) (выполняем только если на шаге 5 мы переименовали директорию bin в airBin) Открываем для редактирования файл PackageApplication.bat. Ищем в нём строчку

set FILE_OR_DIR=-C bin .

и меняем её на

set FILE_OR_DIR=-C airBin .

Дерево файлов проекта после проведения этих шагов будет выглядеть примерно так:

Вкладка Project во FlashDevelop при одновременной разработке 2-х проектов с использованием общей кодовой базы

Уже сейчас можно вполне сносно вести синхронную разработку - используя для хранения совместно используемых классов общий каталог src. Переключение между проектами производится вообще элементарно - достаточно просто сделать двойной щелчок по файлу .as3proj. Среда разработки автоматически скроет .as3proj-файл для текущего проекта, что делает переключение между проектами очень быстрым и ненавязчивым.

Если не производить никаких дополнительных шагов по дальнейшему слиянию, то скоро проявится одно неудобство - в файлах desktopMain.mxml и embeddedMain.mxml бОльшая часть кода и mxml-разметки будет повторяться. Будет нередкой ситуация, при которой в одном mxml поправлено то, что не поправлено в другом. Решить эту проблему можно вынеся весь общий код в отдельный .as-файл, который для удобства восприятия можно назвать Main.as - и подключить его с помощью <mx:Script source="Main.as"/> в обоих ...Main.mxml - файлах.

Разумеется, так придётся создавать всё содержимое основного окна приложения в ActionScript-коде, без применения mxml-разметки. Код станет более объемным и менее читаемым (в рабочем проекте, где я применил такую методику объём разросся с ~50 строк mxml-разметки до ~200 строк чистого ActionScript-кода), но зато его можно будет спокойно редактировать в одном месте без опасений, что какие-то изменения в одном из проектов потеряются.

Ещё один штрих, полезный для совместной разработки AIR и Embedded  - использование различных директив компилятора для каждого из проектов. Во FlashDevelop директивы компиляции задаются на вкладке Compiler Options окна свойств проекта - в строке Compiler Constants:

Директивы компилятора в окне свойств проекта во FlashDevelop

Директивы компиляции, связанные с целью развёртывания проекта, могут понадобиться тогда, когда используются классы, доступные только в AIR. Для embedded-приложения в таких случаях нужно скрыть вызов функций этих классов и соответствующие интерфейсные элементы. По коду примерно так:

if (CONFIG::DESKTOP == true)
{
    // действия, специфичные для AIR-приложения
}
else
{
    // действия, специфичные для embedded Flash
}

Подробнее про использование Compiler Constants во FlashDevelop можно узнать здесь (на английском).

Скачать пример (для Flex 3 Framework).

P.S. Подход работает как для 3-го, так и для 4-го Flex Framework'а.

11 января 2012 01:14 — Георгий Чурочкин