воскресенье, февраля 12, 2006

Разработка Flash-проектов с использованием Apache Ant (доклад на семинаре New Media)

Введение


Как и обещал, публикую свой доклад на семинаре New Media. Тема доклада была «Разработка Flash-проектов с использованием Apache Ant». Состоял он из трех частей. Первая часть называется «Общие сведения об Apache Ant». В ней происходит первое знакомство с этим замечательным инструментом.

Вторая часть называется «Применение Apache Ant во Flash-проектах» и содержит обзор наиболее популярных задач Ant, предназначенных для сборки Flash-проектов.

Третья часть содержит в себе демонстрационный проект. В нем проиллюстрированы некоторые прелести Ant'а.

Собственно, первые две части доклада наиболее полно изложены в презентации формата Microsoft PowerPoint (185k) 2003, которая и демонстрировалась на семинаре. Напомню, что для скачивания файлов с данного хостинга проще всего указать в вашем download-менеджере скачиваемую ссылку в качестве реферрера. Если у вас нет в наличии PowerPoint'а, то вы имеете уникальную возможность скачать с сайта Microsoft PowerPoint Viewer 2003 - совершенно бесплатную тулзу.

После изучения матчасти можно приступать к демонстрационному проекту. На семинаре я демонстрировал сборку проекта с использованием стандартного компилятора от Macromedia (использовалась 8-я версия среды разработки Flash). Проект представлял из себя простейшую галерею картинок. Он был написан целиком на AS2 (если специально написанная сотня строк разреженного кода может считаться чем-то существенным :). Также использовалась библиотека XPath от Xfactorstudio для парсинга конфигурационного XML-файла (XML там простейший, но хотелось продемонстрировать сборку проекта с несколькими путями к классам).

Если вы уже ознакомились с презентацией, то понимаете, что согласно идеологии Ant, проектом являются только исходники и сам билд-файл. Все, что может быть сгенерировано или скомпилировано - проектом не является. Это не хранится в системе контроля версий, не поставляется в виде исходников заказчику. Заказчик всегда может запустить билд-файл проекта и получить предоставленный ему билд, готовый к употреблению. В соотвествии с этим, проект нашей галереи не содержит конфигурационного xml-файла. Этот файл генерируется автоматически: вы просто указываете каталог, из которого берутся jpg-изображения, а билд-скрипт самостоятельно копирует изображения в каталог с билдом и формирует конфигурационный файл. На семинаре я показывал черновую версию проекта, в котором конфигурационный файл содержал обсолютные пути к изображениям. В данной версии я использовал регулярные выражения и сделал все как надо: пути теперь относительные.

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

То есть имея лишь каталог с нашими классами, каталог с внешними библиотеками, каталог с fla-файлом, билд-файл и, возможно, файл свойств (в котором можем указать каталог с исходными изображениями), мы получаем готовое flash-приложение, которое можно запускать и использовать.

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

Помимо описанных выше целей, демонстрационный проект преследовал еще две: возможность работы с проектом в среде Eclipse не переключаясь во Flash или куда-либо еще (то есть и запуск собранного проекта), а также возможность компиляции проекта с использованием компилятора mtasc (для ускорения компиляции).

Установка рабочей среды


Сразу скажу, что на данном этапе вам придется достаточно потрудиться для установки всего необходимого. Большинство из этих действий придется проделать каждому, кто хочет собирать проекты с помощью Apache Ant. Если в вашей фирме у вас имеется сервер для сборки проекта, на нем также придется произвести соотвествующие установки. Радует то, что минимальной конфигурацией тут является лишь Apache Ant. Вы вполне можете написать ant-скрипт, который устанавливает среду, необходимую для сборки вашего проекта :)

Итак, прежде всего вам необходим сам Apache Ant. Хотя... Нет, не только. Возможно, у вас нет главного. А главным тут является виртуальная машина Java от Sun. Но вы ее можете бесплатно скачать с сайта производителя. На настоящий момент там живет версия Java 1.5_06. Вам, в принципе, достаточно JRE, но если вы собираетесь и дальше шагать рука об руку с этой замечательной технологией и разрабатывать под нее, качайте JDK. Не пожалеете.

Ну вот теперь качаем последнюю версию Apache Ant (на момент написания это 1.6.5). Установка его проста и описана в презентации. Повторюсь малость:


  • Распакуйте каталоги bin и lib архива в созданный в Program Files каталог Ant.

  • Укажите каталог Ant в переменной окружения ANT_HOME.

  • Добавьте %ANT_HOME%\bin к переменной окружения PATH.


Следом стоило бы скачать Java Advanced Imaging API. На момент написания последним стабильным релизом был 1.1.2_01. Эта библиотека необходима для задачи Ant image, которая работает с изображениями. Вам вполне достаточно версии JRE, но если вы планируете использовать данную библиотеку для разработки - качайте jdk. Устанавливается просто. Практически автоматически.

Далее вам нужны дополнительные задачи для Ant от сторонних производителей. В нашем проекте используется ANT Contrib. Качайте его на здоровье. Он, как и все вышеупомянутое, бесплатен (как здорово! :) Для его установки просто скопируйте ant-contrib.jar в каталог lib вашей установки Ant.

Кажется, все, что касается непосредственно Ant, установлено. Поехали дальше.

Теперь стоит скачать последнюю версию FlashCommand (без него наш билд-файл просто не сработает). Буквально сегодня я произвел версию 0.9.2 этого инструмента. Просто копируете содержимое архива в Program Files. Если вы укажете каталог с программой в переменной окружения PATH, вам не придется править файл свойств local.properties под себя. Так что рекомендую. Но этого может быть недостаточно для запуска данного инструмента. Вам понадобится .NET Framework версии 1.1 и выше. Возможно, он у вас уже есть. Если нет - стоит скачать Microsoft .NET Framework Version 1.1 Redistributable Package. Это аналог JRE для .NET.

Теперь приступим к скачиванию еще одной бесплатной тулзы - компилятора ActionScript 2.0 Mtasc. На текущий момент версия mtasc равна 1.12. Может я забыл упомянуть, но из-за этой всей .Net'овской темы наш процесс актуален только для Windows. Возможно, в будущем мы это исправим, но сейчас качаем mtasc для Windows, копируем его в Program Files и указываем его каталог в переменной окружения PATH.

Скажу вам по секрету, что на данный момент мы имеем все необходимое для сборки нашего проекта (при условии, конечно, что у вас установлен Flash Professional 8 - fla-файл демо-проекта от него, но если вы сохраните его для версии 7, вам будет вполне достаточно и Flash MX 2004). Достаточно просто распаковать демо-проект в ваш любимый каталог (кстати, сделайте это в любом случае, я еще не написал скрипт распаковки проекта :). Можно просто в командной строке (при условии, что текущий каталог - это корень проекта, то есть каталог, содержащий build.xml) набрать три веселые буквы... Нет, не те. Просто наберите ant и нажмите Enter. Проект должен собраться :) Но мы хотим не просто собрать проект, а работать с билд-файлом, с проектом, получить удобное средство для этой работы. Ведь, по-хорошему, нашим билд-файлом в процессе разработки проекта мы будем пользоваться каждые пять минут. Или чаще. Ну а если реже, то, возможно, вы просто достаточно ленивы? :) Или слишком самоуверены.

Поэтому устанавливаем Eclipse. Просто идем на Eclipse.org и качаем то, что нам нужно. Я рекомендую не пожалеть траффика и скачать Eclipse SDK 3.1.2 - последняя версия, которая мне очень нравится. Напомню, что Eclipse - это не просто среда разработки, это абсолютно расширяемая среда (и не только для разработки). И к тому же абсолютно бесплатная.

Устанавливается Eclipse просто - копируем его в Program Files :)

Теперь вам понадобится плагин для редактирования ActionScript 2.0. Есть бесплатный - ASDT. В моем описании используется платный плагин - FDT. FDT предлагает бесплатный триал, которым вы можете воспользоваться. Если понравится - купите :) Установка описана на сайте FDT.

Ну вот, мы имеем все необходимое для нашего туториала: вы подкованы теоретически, изучив презентацию. У вас есть все необходимое чтобы перейти к практике. Поехали.

Демо-проект: Image Gallery


Данная часть доклада на семинаре New Media демонстрировалась в интерактивном режиме. Сейчас я не могу предоставить вам такой сервис, а потому предлагаю картинки. Кто не любит читать - просто смотрит и ничего не понимает.

Мы уже распаковали содержимое zip-архива с тестовым проектом в наш любимый каталог. Запускаем Eclipse и переключаемся в перспективу Flash. Для этого: Window>Open Perspective>Other...>Flash. Eclipse, как и любая богатая возможностями среда, позволяет добиться одного и того же результата множеством разных способов. Со временем вы откроете множество более удобных способов переключать перспективу, а также поймете, что это такое. Вкратце могу сказать, что, по сути, перспектива - это среда в среде. Примитивно - это набор панелей, предназначенных для решения конкретной задачи (например, работы с ActionScript). Но не только. Это еще и набор контекстов (контекстное меню, конекстные редакторы итд.). То есть переключение в перспективу Flash (которая поставляется вместе с FDT) означает, что у вас все настроено для работы с AS2-проектом. И, главное, у вас есть Flash Explorer - средство для работы с вашими Flash-проектами.

Создаем новый Flash-проект простым кликом правой кнопкой мыши во Flash Explorer'е:



Задаем проекту имя и указываем каталог, в котором лежит наш build.xml. Для этого вам необходимо снять галочку Use Default (указывающую на стандартный путь в Workspace среды Eclipse):



Если в настройках FDT вы правильно указали путь к библиотеке базовых классов (Window>Preferences...>FDT>Core Libraries - надо указать каталог Classes, содержащий пакет mx в вашем каталоге Documents And Settings), то проект приобретет следующий вид:.



Теперь для анализатора классов FDT (для нашего билда, по сути, все равно) необходимо добавить intrinsic-классы, соотвествующие 7-й или 8-й версии Flash-плеера. Добавим классы 8-го плеера. Все, что не лежит в физическом пространстве проекта - вне проекта. Если это классы, то в идеологии FDT они являются Linked Libraries. Их и подключим:



В мастере Create Linked Libraries нажимаем кнопку Add.. для добавления нашей библиотеки. В диалоге Linked Libraries нажимаем кнопку New... (если вы уже не съели на этом собаку и у вас имеется готовая ссылка на FP8). В диалоге Edit Variable указываем в качестве имени нашей библиотеки, скажем, fp8, а в качестве Location просто копируем путь к нашей папке FP8 каталога с базовыми классами среды разработки Flash 8 (та, что в Documents And Settings). Учить нажимать три раза кнопку Ok я вас не буду:



Ниже, для проверки, покажу вам каталог fp8 проекта в раскрытом виде. А то мало ли вы не то указали. Сравните, в общем:



Теперь надо сказать FDT, что в каталогах src и lib содержатся не просто файлы, а классы. Иначе как он догадается? Напомню, что в src мы держим тестовые исходники (AS2-классы), написанные нами специально для данного проекта. Папка lib содержит классы (в среде Flex Builder это могут быть swc - как jar при Java-разработке или dll в .Net-разработке), которые уже даны нам готовыми и которые мы в рамках данного проекта менять уже не будем. Это могут быть в том числе и созданные нами для других проектов классы или наш мощный фрэймворк, используемый во всех проектах. В зависимости от лицензионного соглашения, они могут в том или ином виде храниться в вашей системе контроля версий. Для добавления папок с классами в путь к классам достаточно просто кликнуть правой кнопкой на нужной папке как показано на рисунке ниже:



Вот теперь наш проект выглядит так:



Проект готов для дальнейшей работы. Мы же вести дальнейшую работу не будем, а перейдем к пользованияю Ant'ом в среде Eclipse. Для создания нового билд-файла (который, как следует из презентации, должен лежать в корне проекта) достаточно просто произвести: File>New...>Other...>File, сохранить его в корне проекта и назвать build.xml. У нас имеется уже готовый билд-файл, а потому откроем его на редактирование в редакторе Ant, поставляемом с Eclipse SDK (через контекстное меню на файле build.xml):



Наш билд-файл выглядит следующим образом:


<?xml version="1.0"?>
<!-- ======================================================================
03.02.2006 14:43:20

image.gallery
Ant test project

Constantiner (constantiner at narod dot ru)
====================================================================== -->
<project name="image.gallery" default="all" basedir=".">
<description>
Ant test project
</description>

<!-- Property for operating system detection and checking -->
<condition property="is.windows">
<os family="windows" />
</condition>

<!-- Exec paths section -->
<!-- Local filesystem settings file for default properties overriding (You can provide no property file) -->
<property file="local.properties" />
<property name="flashcommand.path" value="flashcommand.exe"/>
<property name="mtasc.path" value="mtasc.exe"/>
<property name="flash.player.path" location="SAFlashPlayer.exe"/>

<!-- Classpaths section -->
<property name="core.classes" location="${user.home}\Local Settings\Application Data\Macromedia\Flash 8\en\Configuration\Classes" />
<property name="lib" location="lib/"/>
<property name="src" location="src/"/>
<!-- You can add new classpath for flash as pathelement -->
<path id="all.classpath">
<pathelement path="${lib}" />
<pathelement path="${src}" />
</path>
<pathconvert property="one.line.classpath" targetos="windows" refid="all.classpath" />
<!-- form mtasc classpath -->
<property name="mtasc.one.line.classpath" value="${one.line.classpath}${path.separator}${core.classes}" />

<!-- Dirs -->
<property name="build.dir" location="build/" />
<property name="src.assets.dir" location="assets/"/>
<property name="fla.dir" location="fla/"/>
<property name="images.catalog.name" value="images" />
<property name="build.assets.dir" location="${build.dir}/${images.catalog.name}"/>
<property name="log.dir" location="log/"/>

<!-- Files -->
<property name="config.xml" location="${build.dir}/config.xml"/>
<property name="main.fla" location="${fla.dir}/main.fla"/>
<property name="output.swf" location="${build.dir}/image_viewer.swf"/>
<property name="log.file" location="${log.dir}/flashlog.txt"/>

<!-- Main class for mtasc (in usual full-classname syntax) -->
<property name="main.class" value="constantiner.imageViewer.Controller"/>

<!-- Adding Ant-contrib resources -->
<taskdef resource="net/sf/antcontrib/antlib.xml" />

<!-- =================================
target: default
================================= -->
<target name="all" depends="clear,init,compile,img.arrange,create.config" description="--> Ant test project">
<!-- Just do nothing - only dependencies -->
</target>


<!-- =================================
target: all.and.run
================================= -->
<target name="all.and.run" depends="all,run.swf" description="--> Builds all and run">
<!-- Just do nothing - only dependencies -->
</target>



<!-- - - - - - - - - - - - - - - - - -
target: clear
- - - - - - - - - - - - - - - - - -->
<target name="clear">
<delete dir="${build.dir}"/>
<delete dir="${log.dir}"/>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: init
- - - - - - - - - - - - - - - - - -->
<target name="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${log.dir}"/>
<mkdir dir="${build.assets.dir}"/>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: compile
Just compile with FlashCommand (0.9.2 and above)
- - - - - - - - - - - - - - - - - -->
<target name="compile" if="is.windows">
<compile.flashcommand classpath="&quot;${one.line.classpath}&quot;" log.file="&quot;${log.file}&quot;" output.swf="&quot;${output.swf}&quot;" source.fla="&quot;${main.fla}&quot;"/>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: mtasc.compile
- - - - - - - - - - - - - - - - - -->
<target name="mtasc.compile" depends="set.mtasc.classpaths" if="is.windows">
<!-- Preparing main class with mtasc slash syntax -->
<propertyregex property="main.class.prepared" input="${main.class}" regexp="([^\.]*)\." replace="\1/" casesensitive="false" global="true" />
<compile.mtasc.macro classpaths="${mtasc.classpath.prepared}" target.swf="&quot;${output.swf}&quot;" main.class="${main.class.prepared}" />
</target>


<!-- - - - - - - - - - - - - - - - - -
target: set.mtasc.classpaths
- - - - - - - - - - - - - - - - - -->
<target name="set.mtasc.classpaths">
<!-- convert one-line classpath to mtasc -cp format using regular expressions -->
<propertyregex property="temp.mtasc.classpath" input="${mtasc.one.line.classpath}" regexp="([^${path.separator}]*)${path.separator}" global="true" casesensitive="true" replace="\1&quot; -cp &quot;" />
<property name="mtasc.classpath.prepared" value="-cp &quot;${temp.mtasc.classpath}&quot;" />
</target>

<!-- - - - - - - - - - - - - - - - - -
target: img.arrange
- - - - - - - - - - - - - - - - - -->
<target name="img.arrange">
<!-- copying and resizing images using "image" optional ant task -->
<image destdir="${build.assets.dir}" overwrite="yes">
<fileset dir="${src.assets.dir}">
<include name="**/*.jpg"/>
</fileset>
<scale width="600" height="400" proportions="fit"/>
</image>
</target>


<!-- - - - - - - - - - - - - - - - - -
target: run.swf
- - - - - - - - - - - - - - - - - -->
<target name="run.swf" if="is.windows">
<exec executable="${flash.player.path}" >
<arg line="${output.swf}" />
</exec>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: create.config
- - - - - - - - - - - - - - - - - -->
<target name="create.config">
<!-- creating file with header -->
<echo file="${config.xml}" ><![CDATA[<?xml version="1.0"?><images>]]></echo>
<!-- iterating over image files and adding image tags to config (using ant-contrib "for" task) -->
<for param="file">
<path>
<fileset dir="${build.assets.dir}" includes="*.jpg" />
</path>
<sequential>
<echo file="${config.xml}" append="true"><![CDATA[<image src="@{file}" />]]></echo>
</sequential>
</for>
<!-- Finalizing config with closing images tag -->
<echo file="${config.xml}" append="true"><![CDATA[</images>]]></echo>
<!-- screening file separator for different file systems using ant-contrib "if" task) -->
<if>
<equals arg1="${file.separator}" arg2="\" />
<then>
<property name="file.separator.regexp" value="\\"/>
</then>
<else>
<property name="file.separator.regexp" value="${file.separator}"/>
</else>
</if>
<!-- Replacing absolute filepaths with relative using replaceregexp optional Ant task -->
<replaceregexp file="${config.xml}" match="(&lt;image src=&quot;)([^&quot;]*)(${images.catalog.name}${file.separator.regexp})([^&quot;]*)(&quot;)" replace="\1\3\4\5" flags="-g" />
</target>

<!-- = = = = = = = = = = = = = = = = =
macrodef: compile.flashcommand
= = = = = = = = = = = = = = = = = -->
<macrodef name="compile.flashcommand">
<attribute name="source.fla" />
<attribute name="output.swf" />
<attribute name="log.file" />
<attribute name="classpath" />
<sequential>
<echo>Compiling @{source.fla} to @{output.swf} with @{classpath}</echo>
<exec executable="${flashcommand.path}">
<arg line="-e"/>
<arg line="-s @{source.fla}"/>
<arg line="-l @{log.file}"/>
<arg line="-o @{output.swf}"/>
<arg line="-cp @{classpath}"/>
</exec>
</sequential>
</macrodef>

<!-- = = = = = = = = = = = = = = = = =
macrodef: compile.mtasc
Just compiling classes in existing swf file
= = = = = = = = = = = = = = = = = -->
<macrodef name="compile.mtasc.macro">
<attribute name="target.swf" />
<attribute name="classpaths" />
<attribute name="main.class" default="lala" />
<sequential>
<echo>Compiling @{target.swf}</echo>
<exec executable="${mtasc.path}" failonerror="true">
<arg line="-mx" />
<arg line="-swf @{target.swf}" />
<arg line="@{classpaths}" />
<arg line="@{main.class}" />
</exec>
</sequential>
</macrodef>
</project>


В нем легко (надеюсь! :) разобраться: это наглядный и читаемый XML, который, к тому же, содержит комментарии на корявом английском.

В корне проекта вы также найдете файл local.properties. Это стандартный файл свойств, все строчки которого закомментированы. Его цель состоит в том, чтобы хранить в себе ссылки на абсолютные пути в локальной файловой системе (не забываем: наш билд должен собираться на любой машине!). Этот файл не должен храниться в системе контроля версий и при необходимости создается на конкретной машине. В самом начале блока свойств нашего билд-файла имеется ссылка на этот файл (в строке 22). Правило ant гласит: кто первым установит значение свойства, таким это свойство и будет. Именно ссылка на файл локальных свойств находится в начале. Скажу сразу, что в задачах ANT Contrib, которые у вас уже установлены, есть задача var, позволяющая переопределить установленные свойства. Мало ли..

Если вам надо что-то указать, свойственное изощренным настройкам вашего компьютера, просто создаете этот файл и указываете нужные свойства. Я приложил закомментированную болванку чтобы было легче.

В среде Eclipse есть свой встроенный редактор файлов свойств. Через контекстное меню на файле local.properties:



Вам, как минимум, придется указать путь к standalone flash-плееру. Мой файл local.properties выглядит так:


# mtasc.path = D:\\Program Files\\mtasc\\mtasc.exe
# flashcommand.path = D:\\Program Files\\FlashCommand\\FlashCommand.exe
flash.player.path = D:\\Program Files\\Macromedia\\Flash 8\\Players\\Debug\\SAFlashPlayer.exe
# core.classes = ${user.home}\\Local Settings\\Application Data\\Macromedia\\Flash 8\\en\\Configuration\\Classes
# src.assets.dir = assets/


Также можно указать любой каталог, из которого будут браться изображения (свойство src.assets.dir).

Если мы вернемся к редактированию нашего build.xml, то заметим, что панель Outline теперь отражает структуру нашего билд-файла:



Очень удобно и наглядно

Для работы с билд-файлами существует также специальная панель Ant (панели в терминологии Eclipse называются View). Для ее открытия надо произвести следующее: Window>Show View...>Other...>Ant>Ant. Вы можете переместить панель куда вам будет удобнее. Эта панель служит для управления вашими билд-файлами. Щелкаем правой кнопкой на панели и добавляем билд-файл:



Появится список проектов, и если мы отметим Only show *.xml files, то наш поиск существенно сузится:



Нажимаем Ok и получаем представление нашего билд-файла:



Зеленые мишени представляют собой цели (target). Мишень с треугольником - цель по умолчанию (будет запущена при запуске билд-файла без параметров). Жирные мишени - публичные цели (цели, снабженные описанием). Вы можете набрать в коммандной строке параметр -projecthelp и получить следующее для нашего билд-файла:

ant build.xml -projecthelp
Buildfile: build.xml

Ant test project

Main targets:

all --> Ant test project
all.and.run --> Builds all and run
Default target: all

Не очень наглядно? Что же, можно сделать нагляднее. И в ваших силах позаботиться об этом в своих проектах.

Если раскрыть цели, то мы увидим задачи (task). То есть билд-файл отражает все наши текущие цели и задачи. Мы можем выполнить их как все вместе, так и по отдельности. Но для того, чтобы запустить наш билд-файл, нам надо его сконфигурировать. Поможет контекстное меню:



Появится диалог настройки свойств со множеством вкладок. Начнем со вкладки JRE. Так как мы имеем внешнюю установку Ant (Eclipse идет со своей поставкой), которую сконфигурировали и будем использовать, стоит использовать и отдельную JRE:



Также нам надо добавить в конфигурацию для Eclipse наш ant-contrib.jar. Просто Add External JARs...:



Вообще-то мы можем добавить этот jar для всех проектов через Window>Preferences. Но это вам задачка на будущее. Там же вы сможете указать рекомендованной к использованию вашей, а не эклипсовской копии Ant. Но вот мы добавили наш JAR:



Теперь все готово для запуска билда. Пока вы делаете серию глубоких вдохов-выдохов, я примерно расскажу о структуре нашего билд-файла (стоит для начала пользоваться панелью Ant - нагляднее).

У нас имеется цель all, которая является целью по умолчанию и собирает проект, полностью готовый к использованию. Одним из правил хорошего тона считается называть такую цель build, но тут мы использовали альтернативное правило хорошего тона. Если мы обратим внимание на выполняемые в рамках цели задачи, то удивимся - их нет. Данная цель построена целиком на зависимостях.

Другой такой целью, построенной целиком на зависимостях, является all.and.run. Эта цель помимо сборки проекта еще и запускает его во Flash-плеере. Почему она не указана целью по умолчанию? Да потому что в качестве цели нашего билда по определению является сборка проекта. Его запуск - это опциональная сервисная цель. Почему эта цель публичная? Да потому, что она не требует определенных знаний о составе проекта, и поэтому доступна человеку непосвященному. Может даже оказаться ему полезной.

Помимо этих публичных целей есть цели приватные или экспертные. Они намеренно сделаны безо всяких зависимостей чтобы эксперт мог из них, как из кирпичиков, совершать нужные действия (например, в процессе разработки проекта). Например, цель clear приводит проект в первозданную чистоту: только исходники и ничего больше. Цель init создает необходимые каталоги (каталог билда и лога). Цель img.arrange осуществляет преобразование и копирование изображений. Цель create.config создает по этим изображениям конфигурационный файл. Цель run.swf просто запускает наш проект (если он есть).

Вы можете набрать в коммандной строке ant clear init compile img.arrange create.config run.swf build.xml и получить собственный аналог цели all.and.run. Вы можете пошагово выполнять цели в среде Eclipse (для этого предоставлен удобный GUI).

Стоит также упомянуть про поддержку Mtasc. В билд-файле есть цель mtasc.compile, которая зависит от цели set.mtasc.classpaths (не имеющей никакой самостоятельной ценности). Данная цель компилирует наш swf с помощью компилятора mtasc. Компилятор mtasc имеет дело только с AS2-файлами, и потому в рамках данной цели просто перекомпилирует классы в существующей swf-ке. Делает он это быстро, гораздо быстрее MMC. Именно для этого и используется в данном проекте.

Конкретно данный проект и так компилируется быстро, но на больших проектах он может дать существенный выигрыш (три секунды против трех минут). Понятно, что если вы меняли графику во fla-файле, придется компилировать с помощью MMC (я сейчас не говорю о полностью опенсорсной разработке - для создания графики в библиотеке есть swfmill). При пользовании mtasc'ом придется смириться с тем, что он более строго относится к спецификации ECMA, а потому, если у вас нет практики написания хорошего кода, вам придется менять код под mtasc. Но иногда это сэкономит вам кучу времени (и нервов :)

К чему я это все? К тому, что цель mtasc.compile по определению экспертная. В нашей модели с ее помощью в принципе нельзы собрать билд - она используется для разработки.

Возможно, следует добавить цель compile.mtasc.and.run. Но это вы уже сделаете самостоятельно.

Также стоит обратить внимание на использование макросов в билд-файле (macrodef). Если у вас в проекте несколько fla-файлов, это поможет избежать дублирования кода. Также эти макросы можно использовать и в других проектах.

Выводы


Мы убедились, что написание и пользование билд-файлами - проще пареной репы. Вы можете даже не переключаться в среду Flash и вести всю разработку в Eclipse. Хотите отлавливать трэйсы? Используйте AFTERTHOUGHT! Понятное дело, что пошаговую отладку придется производить только в среде Flash. Это обидно. Но скажите честно, так ли часто вы пользуетесь пошаговой отладкой?

Так что пишите билд-файлы к вашим проектам! Это ничуть не сложнее, чем писать на AS1 - тот же самый процедурно-объектный подход.

И когда через год вас попросят что-то поправить в старом проекте, вам не придется мучительно вспоминать, что где скомпилировать, что куда скопировать: у вас есть волшебный билд-файл.

Пишите ваши success stories в комментах! Пусть все узнают, как муравей спас вам жизнь :)

Что дальше?


Дальше - написание собственных задач Ant. У меня есть грандиозная идея кроссплатформенного аналога FlashCommand, еще более кастомизированного, написанного как полагается - на Java.

А по части нашего демо-проекта? Ну вы можете добавить туда загрузку скомпилированного проекта по FTP на сервер в цели install. После совершения этой операции вам может быть средствами Ant послано письмо по e-mail. Вы можете добавить серверную часть и в одном билд-скрипте компилировать клиента и деплоить его на сервере, который деплоится тут же. Возможностей - море. Ваш Ant-скрипт может самостоятельно синхронизироваться с репозиторием, скачивать последние версии библиотек по FTP...

Скажите мне лучше, а чего не может Ant?

Комментариев 28:

Blogger Омар сообщает:

Спасибо за доклад, видно что не один и не два деня были на него потрачены.

13 февраля, 2006 17:08  
Blogger Unknown сообщает:

2Омар
Да, не один :)
Главное чтоб польза была :))

13 февраля, 2006 17:33  
Anonymous Анонимный сообщает:

Фундаментально! Пока не осилил - много букв, мало времени. На выходных почитаю :))

14 февраля, 2006 10:37  
Anonymous Анонимный сообщает:

Действительно, статья. Не заметка там какая-нибудь...
Пользовался антом раньше, сильно разбираться руки не доходили, так, по минимуму. Нашел много для себя нового и полезного.
Спасибо!
З.Ы. Похоже, зря я на семинар не приехал :(

14 февраля, 2006 10:47  
Anonymous Анонимный сообщает:

Спасибо за подробную статью!
всё очень точно и подробно, как раз для меня:)

Вчера пол дня разбирался, сегодня
наконец запустил тестовый пример!

польза есть!

14 февраля, 2006 12:38  
Blogger Омар сообщает:

Что-то мне оформление винды сильно понравилось, ссылки нет на тему?

14 февраля, 2006 15:48  
Blogger Unknown сообщает:

2Fix
Ну зато когда осилишь вполне может оказаться полезным :)

14 февраля, 2006 16:36  
Blogger Unknown сообщает:

2prof
Нас не так много - флэш-разработчиков. Иногда надо и собираться :)

14 февраля, 2006 16:38  
Blogger Unknown сообщает:

2Agahov
Похоже, ты первый! :)
Проблем не было? Все заработало?

14 февраля, 2006 16:41  
Blogger Unknown сообщает:

2Омар
Тема Panther идет вместе с программкой под названием StyleXP. Но, насколько я понимаю, ее можно скачать и установить отдельно.

14 февраля, 2006 16:43  
Anonymous Анонимный сообщает:

1)Меня не много сбило что в итоге получается два ant. Один под eclipse а другой для командной строки. (для примера с кошками я обошелся встроенным в Eclipse)
2)думал куда девать ANT Contrib(ant-contrib.jar). В итоге скопировал его в ANT_HOME/lib.
Заработало всё!
сейчас делаю свой build:)

15 февраля, 2006 10:09  
Blogger Unknown сообщает:

2Agahov
Про установку Ant Contrib прошу прощения: у меня Semagic при публикации поста некоторые абзацы почикал. Как раз про его установку почикано было. Сейчас поправил.

15 февраля, 2006 13:56  
Blogger Unknown сообщает:

2Agahov
Ну а если четко хочешь пользовать один на всех Ant, можешь в Эклипсе сменить Ant Home на свой установленный :)

15 февраля, 2006 13:58  
Anonymous Анонимный сообщает:

что я и пытался сделать, но eclips начал сильно ругаться.
лучше я потрачу время на внедрение ant
ещё планов громадьё: подключить внедрить тесты, разобраться swfmill, цель получать в итоге один swf из различных библиотек и ресурсов. С помощью ant, swfmill и mtasc. Предполагаю что могут быть проблемы с mx...да мало ли что ещё:)

15 февраля, 2006 15:28  
Blogger Unknown сообщает:

2Agahov
Решение проблем с mx-классами №1.
В качестве второго решения можно использовать опцию -mx в mtasc. Но в любом случае в связке mtasc и swfmill использовать v2 Components от Macromedia не получится. Или придется невероятно сильно извратиться. Но есть другие компоненты.

15 февраля, 2006 16:21  
Anonymous Анонимный сообщает:

от mtasc + swfmill отказываться не хочется. Так как в моём проекте mx ещё не используется, то тут можно импровизировать.
из альтернативных к mx я пока нарыл только: AsWing.org

за подсказку как компелить v2 спасибо! Обязательно к нему вернусь если не подружусь с swfmill:)

есть ещё решение написать свою библиотеку. Писать её не полную а под текущие задачи. постепенно расширяя в стили xp,
может взять что то простое за прототип.

15 февраля, 2006 17:45  
Blogger Unknown сообщает:

2Agahov
Разработка собственной библиотеки компонент в стиле XP дело похвальное и, теоретически реализуемое. Только стоит не забывать об одной вещи: ты ведешь в стиле XP некий проект. Но создание UI-компонент - это отдельный и сложный (поверь) проект. И в итоге просто окажется, что одновременно в стиле XP ты будешь вести два проекта. Черезчур накладно. Не проще ли поручить ведение проекта UI-компонент тем, кто его и так уже ведет. Просто проанализировав альтернативы. Их не так много.
Опенсорсные:
ActionStep
AsWing
SMX
Платные:
известные нам v2 components от Macromedia
mCOM

Выбор-то есть! Многие из них (AsWing и ActionStep) - mtasc-совместимые.

15 февраля, 2006 20:34  
Anonymous Анонимный сообщает:

Согласен, что собственная разработка стандартных UI копанет, шаг сомнительный. Пойду на него только в крайнем случае, исчерпав все альтернативы.
В жизни Хр – пока только теория и применения отдельных элементов:(
Всё пошел изучать существующие UI :)

16 февраля, 2006 00:57  
Anonymous Анонимный сообщает:

mtasc не работает. Ты ему название класса передаешь без ".as"

21 февраля, 2006 11:04  
Blogger Rip The Spam сообщает:

Замечательная статья, только что дочитал, остался только один вопрос: а что все-таки делает тот самый Contrib? Я понимаю, что можно и догадаться, и на сайт их сходить почитать, но -- в твоей статье отсуствие какого-либо пояснения по этому поводу -- как белое место, режет глаз.

И еще: у меня ant все компильнул, но выдал ошибку "BUILD FAILED
D:\Swf\Ant\demo\image_gallery\build.xml:127: Could not create task or type of type: image."

Я правильно понимаю, что мне просто нужно было установить "Java Advanced Imaging API."

21 февраля, 2006 18:42  
Blogger Unknown сообщает:

2Максим Прокошин
Ты на моем примере или вообще? И какой у тебя mtasc. У меня 1.12 и этот пример работает в чистом виде. Хотя, конечно, с .as надежнее...

21 февраля, 2006 22:47  
Blogger Unknown сообщает:

2Рост
В данном примере ant-contrib выполняет задачи if, propertyregex, for.
Ну а без Java Advanced Imaging API задача image не заработает.

21 февраля, 2006 22:50  
Anonymous Анонимный сообщает:

Да, Костя, работает, ошибся я. Похоже, проблема в том, что я пользовался таском mtasc от as2ant.

22 февраля, 2006 10:37  
Blogger Rip The Spam сообщает:

Ссылка на XPatn изменилась: теперь это http://www.xfactorstudio.com/downloads/XPath4AS2.zip

25 мая, 2006 02:51  
Blogger Unknown сообщает:

2Рост
А она разве не всегда такой была?

25 мая, 2006 10:23  
Blogger Unknown сообщает:

2Рост
Точно! Они там все поменяли!

25 мая, 2006 10:25  
Blogger meiciuc сообщает:

Добрый день. Если он конечно добрый. В чем я лично сомневаюсь. Прочитал статью, впечатлило, решил попробовать. Выполнил требования, решил проверить на момент до установки eclipsе. И тут началось
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre1.5.0_06\lib\tools.jar

действительно такого файла нет.

[taskdef] Could not load definitions from resource net/sf/antcontrib/antlib.xml. It could not be found.

указаный в статье ant-contrib.jar не нашел, есть только cpptasks.jar

Возможно, я еще чего не учел по-незнанию. Очень расчитываю на помощь. Спасибо.

04 октября, 2006 12:54  
Blogger Unknown сообщает:

2serghei
Думаю, что главная проблема, что Вы не пользуютесь очевидной помощью. Что сложного сходить по ссылке и сразу найти исчерпывающий ответ по первому пункту? Думаю, что ничего.
По второму вопросу читаем внимательно раздел "Установка рабочей среды", где есть ссылка и информация, что с этой ссылкой делать.
В итоге две рекомендации: внимательность и самостоятельный поиск ответов на вопросы. Можно написать сколь угодно большую статью и все равно не раскрыть все досконально.

04 октября, 2006 13:26  

Отправить комментарий

Вернуться на главную