четверг, февраля 23, 2006

Скупой Бальтазар

На FlashAnt, ресурсе и блоге Арала Балкана (Aral Balkan), подарившего Flash-сообществу ряд продуктов, а, самое главное, собравшего воедино опенсорсное комьюнити, появился интересный пост «Скупость Бальтазара?». Очень поучительный пост, рекомендуемый к прочтению.

Вкратце история такова, что в mail-list osFlash пришло письмо, в котором приводилась ссылка на описание патента некого Нейла Балтазера (Neil Balthaser), который якобы запатентовал RIA патентом США. Арал развеял сомнения (да вы и сами можете развеять прочитав информацию о патенте) о том, что теперь всем создателям RIA придется башлять этому хитрому перцу. Но не все так хорошо.

Бальтазер запатентовал следующую технологию. Существует некое web-based приложение (очевидно подпадающее под категорию RIA), с помощью которого пользователь в режиме онлайн создает некое RIA (презентацию, учебный курс, форму, галерею итд.), которое затем он может сохранить на своем компьютере. И вот такой вот вид сервисов (приложений) этот пройдоха запатентовал. Очевидно по принципу «кто первый догадался запатентовать». Мало того, он открыл свой сервис, который использует запатентованный принцип. Ссылку приводить не буду - мне не хочется рекламировать подобные ресурсы.

Я, например, совершенно не юрист и не представляю какое это может оказать влияние на российских разработчиков. Но, на самом деле, наша контора сейчас разрабатывает продукт, который в будущем планировалось использовать именно по такой схеме. И, получается, что либо американский рынок будет закрыт, либо придется раскошеливаться этому проныре. А сколько еще подобных патентов может существовать?

Все это очень грустно и не только мне. В вышеприведенном посте Арала содержится очень много сожаления по поводу подобных поступков стяжателей. Арал призывает перво-наперво бойкотировать сервис этого человека (присоединяюсь). Арал также высказывает надежду, что Европейский союз не подчинится практике патентования, принятой в США.

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

Update: Что-то странное сегодня на эту тему творится. Тут же в фиде Planet Eclipse увидел аналогичный пост: (им)патентные террористы разрушают индустрию.

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

Какую SCM использует Adobe

Давно интересовался, какие системы контроля версий используют софтверные гиганты. В частности, те, от кого непосредственно завишу я. Я не знаю, что использовалось в Macromedia, но узнал, что Adobe (и все его подразделения, включая новоприбывших макромедийцев) использует Perforce.

Что же, хороший выбор. Я сам им раньше пользовался и нахожу вполне удобным. Но, честно сказать, после того как перелез на Subversion, больше ничего в этой жизни уже и не хочу :) Помимо удобств, предоставляемых Subversion, она еще и бесплатна. Но выбору Adobe я порадовался - серьезная корпорация с большей охотой пользуется продуктом, имеющим поддержку...

суббота, февраля 18, 2006

FlashCommand 0.9.3

По просьбам телезрителей во FlashCommand вернулась когда-то убранная Майком Чамберсом опция -y, закрывающая fla-файл после компиляции. Для тех, кто только что подключился к нашему эфиру, сообщу, что для того чтобы быть в теме, надо пройти по ссылке (а там еще и еще - гипертекст ведь!). Как всегда качаем саму программу (требует .Net 1.1 и просто копируется в Program Files) и исходники для Visual Studio 2003. Для более комфортного скачивания укажите в качестве реферрера в вашем download-менеджере эти же ссылки. Ну и сообщайте о багах и пожеланиях.

четверг, февраля 16, 2006

Сайт о Flex, AJAX, RIA и всех сортах мультимедиа-приложений для Web. Требуются безумцы.

Михаил Antares Клишин опубликовал в своем блоге призыв, клич о том, что пора выбираться из пещер и нести в массы свет нашей церкви. Святая катакомбная церковь Flash-платформы ищет подвижников, готовых усмирять плоть и носить длинные черные плащи не снимая, денно и нощно трудясь на благо просветления неверных и избавления мира от греха.

Ну а если говорить серьезно, то речь идет о создании ресурса, посвященного RIA (насыщенные интернет-приложения). Вы еще не прониклись идеей перенесения всего слоя представления (presentation layer) на клиент? Тогда мы идем к вам!

Не одного только Антареса, меня, ну и тебя удручает незавидное положение в нашей с вами отрасли. Заказчики знают о нас как о производителях Масяни и баннеров «Найди кнопку Закрыть». Программисты, архитекторы и менеджеры, занимающиеся разработкой корпоративных приложений, держат нас за малоквалифицированных выскочек (и во многом они правы), на которых можно лишь смотреть свысока. Продавцы сотовых телефонов при вопросе о наличии в телефоне FlashLite отправляют нас в ближайший компьюьерный магазин, торгующий Flash-накопителями. И даже наши длинные черные плащи частенько носят различные неформального вида молодые люди, для которых нет разницы между IT и «Эй ты!».

Чем ты занимался вчера? Тебе стыдно говорить о том, что ты весь день чистил библиотеку fla-файла, получившегося после импорта через swf decompiler экспортированного из Корела макета соседского дизайнера, которому влом изучать Flash? И при этом ты называешь себя Flash-разработчиком?

Настало время расставить точки над i. Нам нужен авторитетный ресурс, четко предназначенный для разработчиков. Мы можем сделать сильное и профессиональное Flash-комьюнити. Мы можем, наконец, начать формироваться как профессионалы, чтобы нас таковыми и воспринимали.

Есть предложения? Отмечайтесь в комментах.

Кстати, а никто не в курсе, что представляет из себя процесс создания официальной MMUG? Ведь было бы прикольно объединить все сразу: создать user group и ресурс, посвященный RIA на сайте этой группы.

воскресенье, февраля 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?