Flex пока еще не отпускает меня, и приходится с ним возиться. Для начала, надо отметить, что Flex фреймворк в целом хорошая штука. Местами даже изящная штука (это я следую американскому стилю, которому меня научил Яков Файн: сперва похвалить, потом поругать).
Но вот в некоторых других местах Flex сделан весьма по-идиотски, и доставляет кучу эмоций. Видать весьма разнородная по техническому уровню команда над ним работала. И вот компиляторами точно занимались криворукие индусы.
Давеча я убрал maven/flexmojos из своих проектов, и заменил их ручной конфигурацией проекта в IDEA и ant скриптами. Надо сказать, что так проще и лучше. Во всяком случае, для меня этот вариант явно комфортнее.
Теперь, в отличие от варианта c flexmojos, проект действительно легко подымается с нуля на машине нового разработчика, сразу собирается и запускается. Все swc зависимости лежат прямо в папке libs в самом проекте. А все настройки IDEA комитятся в репозиторий вместе с кодом проекта (ну почти все, кроме workspace.xml).
Имея такую благостную картину, я решил взяться за проблему, которая уже давно мне докучает.
У нас есть ряд модулей (swc библиотек), которые написаны на чистом AS, не имеют никаких зависимостей от Flex SDK, и используются во многих проектах. Несмотря на то, что зависимостей нет, compc все равно старательно сует внутрь swc файла кучу классов из sdk. В результате модуль получается привязанный к конкретной версии sdk. И попытка использовать его в проекте с другим sdk может давать непредсказуемые эффекты, вплоть до того, что проект просто не соберется.
Стало быть, задача в том, чтобы убедить compc не пихать внутрь swc ничего лишнего, кроме классов и ресурсов самого модуля. Увы, адобовские инженеры постарались, чтобы задача эта оказалась нетривиальной.
Я вот, в силу ограниченности моего интеллекта, в упор не понимаю, нахрена вообще нужно пихать классы из flex sdk внуть swc модуля. Пусть даже он имеет зависимости от них (а тем более, если не имеет).
Еще надо отметить, что mxmlc и compc имеют хренову тучу опций, большая часть из которых нафиг никому не нужна. А еще они имеют двойной синтаксис описания этих опций: в виде аргументов командной строки и в виде xml-узлов в flex-config файле. Разобраться со всей этой ботвой не просто.
Нужной опции -- не включать ничего лишнего, нет. Я не нашел. Поправьте меня, если я ошибаюсь. ИМХО, это и не опция должна быть, а поведение компилятора по умолчанию.
Ладно, опции нет, а flexmojos все-таки умеет это делать. Изучив flex-config файлы, которые генерирует flexmojos, я понял, в чем фишка. Нужно все зависимости, в т.ч. зависимости от flex sdk, подключать через external-library-path. И flex библиотеки тоже.
Однако вот еще нюанс: подключать нужно swc файлы, а библиотеки в составе flex sdk лежат в виде swz файлов. В виде swc файлов они есть в артефактах flexmojos. Оттуда я их и взял. Где еще их можно взять, не знаю. Разве что собрать самому из сорцов flex sdk. Видимо разработчики flexmojos так и делают.
В итоге получается такое:
<exec executable="${compc}">
<arg value="-debug=true"/>
<arg value="-external-library-path=${libs}/playerglobal-11.swc"/>
<arg value="-external-library-path=${libs}/framework-3.5.0.12683.swc"/>
<arg value="-external-library-path=${libs}/flex-3.5.0.12683.swc"/>
<arg value="-external-library-path=${libs}/Mate_09_1.swc"/>
<arg value="-source-path=./src"/>
<arg value="-include-classes"/>
<arg value="com.flashdevs.yzh.log.Connector"/>
<arg value="com.flashdevs.yzh.log.DebugConsoleLogTarget"/>
<arg value="com.flashdevs.yzh.log.MateLogTarget"/>
<arg value="-output"/>
<arg value="${basedir}/../classes/debug-console-log-target.swc"/>
</exec>
В результате небольшой модуль из 3х классов превращается в аккуратный swc файл размером 5Kb, а не в монстра в 300Kb, которого не ко всякому проекту подключишь.
Ну и зависимости: playerglobal-11.swc, framework-3.5.0.12683.swc, flex-3.5.0.12683.swc, Mate_09_1.swc лежат в папочке libs внутри самого проекта.
Я, наконец, сделал это :)
btw, если вы знаете, как эта задача решается стандартными средствами, подскажите плз.
Comments
Andrey (not verified)
Thu, 12/15/2011 - 15:11
Permalink
В FB это делается автоматом.
В FB это делается автоматом. В свойствах Flex Library Build Path -> Вкладка Library path -> комбобокс Framework linkage стоит в Use default (external). Если задампить конфиг (опция -dump-config=config.xml в additional compiler arguments), то можно увидеть, что это делается как раз с помощью external-library-path:
<external-library-path>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\player\10.2\playerglobal.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\framework.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\textLayout.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\spark.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\sparkskins.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\rpc.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\charts.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\spark_dmv.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\osmf.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\mx\mx.swc</path-element>
<path-element>D:\Projects\sdks\flex_sdk_4.5.1\frameworks\libs\advancedgrids.swc</path-element>
</external-library-path>
То есть ты все делаешь правильно)
Pavel (not verified)
Thu, 12/15/2011 - 17:07
Permalink
Да вроде можно всю папку
Да вроде можно всю папку исключить:
VapeS (not verified)
Thu, 12/15/2011 - 18:11
Permalink
Оказывается я не один, кто
Оказывается я не один, кто ушел с мавена на ант!
yzh44yzh
Thu, 12/15/2011 - 19:01
Permalink
Поправка от Alexey Taran:
Поправка от Alexey Taran:
Flex библиотеки находятся таки в swc %sdk%\frameworks\libs, а swz (то бишь rsl) в %sdk%\frameworks\rsls
Add new comment