Складання flex проекту з використанням maven, SavePearlHarbor
Ще одна копія хабора
Складання flex проекту з використанням maven
Замість передмови
Досить багато чув про складання flex проектів за допомогою maven, але всі якось не доходили спробувати. З maven познайомився близько року тому, коли потрапив працювати в проект, бек-енд якого збирався за допомогою maven. Проект був гетерогенний: бек-енд – java, користувальницький фрон-енд – flash, адміністративний фронт-енд – java+js, бд – MySql. Історично склалося, що це збиралося якось. Одного дня, було вирішено все це перевести на уніфіковану збірку. Відразу скажу, що вийшло з великими застереженнями, але зрештою збірку запускав саме maven. У java-світі використання maven вже майже стандарт, і, якщо дотримуватися maven ідеології, все досить добре. Того разу перевести флеш мені вдалося через запуск ант-скрипту збірки. Тепер же, захотілося спробувати все чесно. Кому цікава ця спроба, прошу під кат.
Почав, звичайно, з пошуку плагінів, які могли б взагалі просто зібрати flex-проект. На перший погляд їх досить багато, щоб можна було вибрати, але все виявилося дещо прозаїчнішим. Більшість проектів або занедбані або просто відсутні. Загалом, потикавшись у пошук, вирішив спробувати найпоширеніший. Це flex-mojos-maven-plugin. Тут я трохи заблукав, оскільки варіантів виявилося більше одного. Історично проект переводився з одних координат на інші, аналогічно з репозиторіями та вихідниками. Найнеприємніше в тому, що наступні проекти ніяк не посилалися на своїх попередників (у ресурсах можна переглянути історичний розвиток проекту, якщо цікаво). Зрештою, було знайдено останню версію. Отже:
Спроба номерразів: net.flexmojos.oss v.6.0.0
Так, забув згадати, що експеримент проводився в IntelliJ IDEA, яка має підтримку і maven, і flex. Однак, це зовсім не принципово, все те саме можна було зробити з командного рядка.
Як виявилося, IDEA за замовчуванням знає архетип для net.flexmojos.oss v.6.0.0. Загалом це був приємний сюрприз. Стандартна maven-генерація – clean compile – Fail. Отримуємо 4 помилки:
[ERROR] Project FlexMojosTest:FlexMojosTest:1.0-SNAPSHOT (D:\Projets\FlexMojosTest\pom.xml) має 4 errors [ERROR] Unresolveable build extension: Plugin net.flexmojos.oss:flexmojos-maven-plugin:6. або одна з його dependencies не може бути ухвалена: Захищена від спільних dependences для net.flexmojos.oss:flexmojos-maven-plugin:jar:6.0.0 (): Failed to read artifact descriptor for net.flexmojos.oss:flexmojos-maven -plugin:jar:6.0.0: Failure to find com.adobe.flex:framework:pom:4.6.0.23201 in http://repository.sonatype.org/content/groups/flexgroup був повідомлений в місцевому репозиторії, рішення буде not reattempted until update interval of flex-mojos-plugin-repository has elapsed або updates are forced -> [Help 2].
Які коротко повідомляють про неможливість дозволити залежності плагіна, flex-фраймворку та всього, що з ним пов'язано. Це був не найочікуваніший результат. Оскільки роздільна здатність залежностей одна з сильних сторін має. Перевірка репозиторіїв показує, що насправді фреймворку з подібними координатами немає. Перша невдача.
Спроба номер два
Спробую створити аналогічний проект, але на основі опису від Adobe. Там використовується раніше версія плагіна org.sonatype.flexmojos v.4.0-RC2. Аналогічні дії щодо створення проекту з архетипу mvn clean compile - Fail. За великим рахунком, великийрізниці в повідомленнях про помилки немає, знову не знайдено залежності для плагіна. Щоправда, цього разу інші.
Спроба номер три
Пробую ще варіант, описаний у рекомендації IntelliJ IDEA. У ньому використовується версія v4.2-beta. Це остання версія плагіна в цій галузі, яка доступна в репозиторії. Як не дивно, але ця нехитра дія приносить свої плоди та компіляція проходить успішно! Це перша вдала спроба без особливих шаманських танців із бубном.
Запуск юніт-тестів
mvn clean test - Fail. Перший запуск тестів провалився. Виходячи з ліг, не знайдено дебажний флеш-плеєр. Приємно, що тут же у лозі є куди звернутися з цього питання. За посиланням з лігва, до речі, це не останній варіант документації, дізнаюся, що треба явно вказати шлях до дебажного плеєра. Способів два: це додати шлях до системної змінної PATH, або скористатися таємною властивістю, що підхопить плагін. Мені ближче друге. Тим більше, що потім можна буде зробити профайл для кожного розробника, якщо потрібно. Пробуємо, додаємо змінну з абсолютним шляхом до дебажного плеєра і отримуємо нову помилку:
[ERROR] Використовується для виконання результату org.sonatype.flexmojos:flexmojos-maven-plugin:4.2-beta:test-run (default-test-run) на проекті FlexMojosTest: Неправильний стан: flashplayer closed, але плакати .
Це явно прогрес, хоч і не найкращий його варіант… При цьому це помилка саме плагіна, тому що запуск цього тесту через IDEA проходить успішно, що не може не тішити, оскільки жодних додаткових налаштувань не було зроблено. Точно не впевнений, що саме вплинуло на процес, але перехід на flexunit4 і написання справжнього тесту повністю врятувало ситуацію. Тест запустився і виконався без зайвих помилок у лозі!
Отже, мінімальної мети досягнуто: mvn clean package працює!
Перехід на "чистий" as3 проект
Останнім часом я не часто роблю саме flex-проекти, все частіше це as3 проекти без використання mxml. Продовжую пристосовувати проект до цих потреб. Для початку змінимо назви, щоб не було сумнівів і замінимо стартовий клас з mxml на as. У конфігурації плагіна є сенс вказати новий стартовий файл, тому що за замовчуванням використовується Main.mxml, а після його заміни на Main.as втратяться можливості автозапуску флехи після складання та типового дебагу через IDEA, а це не дуже приємно. Звертаю увагу, що потрібно специфікувати лише назву файла. За великим рахунком, можна не змінювати назви каталогів вихідників та тестів, але мені якось так приємніше.
Оптимізація
Проект не відрізняється великою кількістю коду, але важить в дебажной версії 853 б, в релізній 613. Перевіримо, чого можна досягти з використанням оптимізації від flexmojos. Зважаючи на все, оптимізація проходить у кілька етапів (я знайшов у classes 4 файли, думаю, це і є етапи оптимізації). Після включення оптимізації для дебага вийшло 391б, навіть менше релізного. Оптимізатор так само вміє стискати зображення ресурсів, за це відповідає параметрqualityконфігурації від 0 до 1. Швидше за все, це аналог якості jpeg.
НотаткаНа жаль, так і не вдалося перейти на останні версії плагіна (net.flexmojos.oss), для 5 версії не працює юніт тестування, а для 6 не знайдено компілятора в репозиторії (правда є тулза , яка начебто дозволяє мавенізувати будь-який flex-sdk). Але навіть із поточним фукціоналом вже дуже непогано.
Робота з fla-ресурсами
Дозвіл залежностей, це один з дуже великих плюсів maven, коли вони доступні впублічних репозиторіях та проблема, коли немає. При розробці (особливо ігор) багато ресурсів зберігати у свіках, одержуваних із fla-проектів. Деплоїти їх щоразу особливого бажання немає. А якщо свіків багато, то взагалі було б зручно перетворювати їх пакетно. Що можна знайти тут? А ось тут знайти особливо і не чого, на мій великий жаль. Хоча Adobe і перейшов на новий формат fla, який насправді скручений xfl, але консольної утиліти компіляції цього добра в swc/swf досі немає (і можливо не буде). Пошук дав кілька не дуже активних проектів, які на даний момент не можуть бути навіть розглянуті як альтернативи.
Отже, без FlashIDE скомпілювати ресурси не можна. Це засмучує. Можливості які є:
Але всі ці способи за фактом дещо порушують ідеологію роботи maven. Тобто. без додаткових рухів тіла, працювати з дизайнером не вийде.
Так, заразом про fla і контроль версій. Хоча тепер це і не бінарний формат, але мержити його все одно проблематично, бо кожне збереження викликає досить масштабні дифи, які далеко не завжди мерзнуть в автоматичному режимі. Отже, тут вибір кожного. Якщо кількість працюючих з fla одночасно 1, можна спробувати заощадити на контролі версій і використовувати xfl. Щоправда не думаю, що вигода буде дуже великою.
Закінчити хотілося б плагіном визначення якості коду. Знайшов його випадково, коли шукав можливість компіляції fla-файлів. FlexPDM - це opensource від Adobe, який базується на аналогічному java проекті. Документація залишає бажати кращого, вікі не дописана та розкидана за проектом. Але знайти сторінку з використанням виявилося можливим. Також знаходив відгуки та приклади застосування у реальних проектах. Як завжди, взявостанню версію (1.2) плагіна з адобівського репозиторію: mvn site - Fail (навіть якось став звикати до цього результату)
[ERROR] Показано, щоб зробити goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) на проекті FlexMojosTest: Виконання додаткових-сайт goal org.apache.maven.plugins:maven-site -plugin:3.0:site failed: An API incompatibility був налаштований при executing org.apache.maven.plugins:maven-site-plugin:3.0:site: java.lang.AbstractMethodError: com.adobe.ac.pmd.maven. .canGenerateReport()Z
Ось така неприємність. Невеликий пошук показав, що ця плагін в останній версії не працездатний. Пробуємо відкотитись на кілька версій тому і це не допомагає. Загалом це логічно і пояснення тут. Ще трохи порившись у гугле, знайшов репозиторій Alex Manarpies, в якому теж є версія 1.2 плагіна, трохи пізніша. Зачищаю локальний репозиторій, міняю реп - mvn site
[ERROR] Використовується для виконання результатів org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) на проекті FlexMojosTest: failed to get report for com.adobe.ac:flex-pmd-maven- plugin: Plugin com.adobe.ac:flex-pmd-maven-plugin:1.2 або один з його dependencies не може бути вирішений: Використовується для читання матеріалом архітектора для com.adobe.ac:flex-pmd-maven-plugin:jar: 1.2: Could no transfer artifact com.adobe.ac:flex-pmd-maven-plugin:pom:1.2 from/to flexpmd.opensource.adobe (http://code.google.com/p/flex-maven-repo/ source/browse/): Checksum validation failed, expected [Help 1]
Завантаження не вдалося. Остання спроба роботи зі снапшотом плагіна для версії 1.3 також не вдалася.
[ERROR] Розроблений для виконання результатів org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) на проекті FlexMojosTest: failed to get report forcom.adobe.ac:flex-pmd-maven-plugin: Plugin com.adobe.ac:flex-pmd-maven-plugin:1.3-SNAPSHOT або один з його dependencies не може бути ухвалений: Використовується для read artifact descriptor for com. adobe.ac:flex-pmd-maven-plugin:jar:1.3-SNAPSHOT: Помилка на find com.adobe.ac:flex-pmd:pom:1.3-SNAPSHOT in http://repository.sonatype.org/content/groups /flexgroup була повідомлена в місцевому репозиторії, рішення не буде реагувати на повний update interval of flex-mojos-plugin-repository було зроблено або updates are forced -> [Help 1]
Проте, тішить, що якась робота мабуть ведеться. Або велася. Однак, окрім мавену, цей проект працює: Любителям flashdevelop Jenkins+Ant — приклад складання
Замість ув'язнення
Модель flex проекти мавеном можна, особливо якщо це проекти модульні і команда велика. Дуже бажано мати свій репозиторій, з яким працюватиме команда. Якщо проект гетерогенний, особливо з java бек-ендом, то збирання буде ще краще. Але для невеликих розподілених команд, проектів ігробуду, де багато роботи дизайнера, налаштування проекту не настільки просте, як би хотілося. Проблема криється в одній із сильних частин maven - дозвіл залежностей. Репозиторіїв, точніше артефактів у них, поки що не багато і вони не узгоджені. Maven поки не дуже популярний серед flex/flash (особливо) розробників. Дещо засмучує підхід Adoby, який скоріше не підтримує maven складання, ніж підтримує. Але ж шкода, страшенно зручна штука. Проект, на якому проводилися експерименти, там же є чернетка статті, яка писалася по ходу дії. По дифа можна подивитися, що саме і коли додавали.