2012
В первой части описывались основы сборки SWC библиотек.
В этой части рассмотрим случай когда необходимо собрать множество изображений в один swc-файл. Для этого будем использовать так же Apache Ant. В качестве примера возьмём библиотеку флагов famfamfam включающую в себя почти 250 png-иконок.
Для этого понадобится:
- Для каждого изображения создать AS-класс на основе шаблона (отличие будет только в названии файла, имени класса и включенном изображении);
- Скомпилировать созданные классы в SWC;
- Удалить все созданные AS-классы.
В скрипте использована библиотека ant-contrib, которая дает нам FOR для обработки файлов. Она включена в архив с исходниками в конце заметки.
buildIconsLib.properties
### buildIconsLib.properties ###
FLEX_HOME=D:\\SDKs\\4.6.0
dir.lib = ${basedir}\\lib
# source config
src.dir = ${basedir}\\src
#src.ASTemplate = ${src.dir}\\templates\\BitmapTemplate.tpl
src.ASTemplate = ${src.dir}\\templates\\BitmapDataTemplate.tpl
#src.ASTemplate = ${src.dir}\\templates\\SoundTemplate.tpl
# asset config
# директория с иконками
assets.dir = ${src.dir}\\com\\assets\\icons
# путь куда будут генерироваться классы (такой же как и package)
assets.classesDir = app\\icons
assets.package = app.icons
assets.classNamePrefix = Icon_
assets.relativeDir = ../../com/assets/icons
assets.extension = png
# library config
lib.swcPath = ${dir.lib}\\icons.swc
Билд-файл состоит из 4 целей (targets):
1. createTemporaryClasses – генерируем AS классы по шаблону.
<target name="createTemporaryClasses">
<path id="assetList">
<fileset dir="${assets.dir}" includes="*.${assets.extension}"/>
</path>
<pathconvert targetos="unix" property="assetList2" pathsep="," refid="assetList">
<mapper>
<!--http://ant.apache.org/manual/Types/mapper.html-->
<chainedmapper>
<flattenmapper/>
<globmapper from="*.${assets.extension}" to="*"/>
</chainedmapper>
</mapper>
</pathconvert>
<for param="file" list="${assetList2}">
<sequential>
<copy filtering="true" file="${src.ASTemplate}" tofile="${src.dir}\\${assets.classesDir}\\${assets.classNamePrefix}@{file}.as" overwrite="true">
<filterset>
<filter token="ASSET_PACKAGE" value="${assets.package}"/>
<filter token="ASSET_NAME" value="@{file}"/>
<filter token="ASSET_PATH" value="${assets.relativeDir}"/>
<filter token="ASSET_EXTENSION" value="${assets.extension}"/>
<filter token="ASSET_CLASS_PREFIX" value="${assets.classNamePrefix}"/>
</filterset>
</copy>
</sequential>
</for>
</target>
Создаем список файлов с иконками, а затем, pathconvert’ом убираем расширения файлов.
В цикле для каждого png файла создаем свой класс – копируем файл шаблона и задаем ему новое имя и заменем параметры.
2. build SWC – сборка сгенерированных классов
<!-- build the swc -->
<target name="build SWC">
<path id="classList">
<fileset dir="${src.dir}">
<include name="${assets.classesDir}\*.as"/>
</fileset>
</path>
<pathconvert property="classList2" pathsep=" " dirsep="." refid="classList">
<mapper>
<chainedmapper>
<flattenmapper/>
<globmapper from="*.as" to="${assets.package}.*"/>
</chainedmapper>
</mapper>
</pathconvert>
<!-- компилируем классы из списка в swc -->
<compc output="${lib.swcPath}" include-classes="${classList2}">
<source-path path-element="${src.dir}"/>
</compc>
</target>
Создаем список сгенерированных классов. Затем pathconvert’ом конвертируем имена файлов в названия классов (полный путь включая package) для передачи в include-classes компилятора.
3. deleteTemporaryClasses – удаляем созданные временные классы
<target name="deleteTemporaryClasses">
<delete>
<fileset dir="${src.dir}">
<include name="${assets.classesDir}\\*.as"/>
</fileset>
</delete>
<echo>Deleted temporary classes</echo>
</target>
4. buildAssetLibrary - стартовая (deafult) процедура – только запускает остальные в порядке очереди.
<target name="buildAssetLibrary">
<tstamp><format property="StartInstTime" pattern="dd-MMM-yyyy hh:mm:ss" locale="en,UK"/></tstamp>
<echo>[${StartInstTime}] Starting build..</echo>
<antcall target="createTemporaryClasses" />
<antcall target="build SWC" />
<antcall target="deleteTemporaryClasses" />
<tstamp><format property="EndInstTime" pattern="dd-MMM-yyyy hh:mm:ss" locale="en,UK"/></tstamp>
<echo>[${EndInstTime}] Build finished.</echo>
<echo>Asset library built to ${lib.swcPath}</echo>
</target>
В результате у нас будет готовая для использования библиотека всех флагов.
Исходные коды со скриптами: zip-архив (220Kb)
Пояснения:
buildIconsLib.xml – билд-файл собирающий swc из иконок.
buildSWCs.xml – билд-файл создающий swc со стилями, swc с переводами и обращается к buildIconsLib.xml для создания swc с иконками.
Полезные ссылки:
Часть 1: Сборка SWC библиотек при помощи Apache Ant
Using Flex Ant Tasks
Auto-generate SWC asset libraries with Apache Ant and the Flex SDK


