Сейчас будет не так много про flexmojos, но много про workflow на основе IDEA, flexmojos, subversion и консоли.
Итак мы создали проект с библиотечными модулями. Теперь создадим другой проект, который будет использовать эти модули.
Запускаем IDEA: Alt+F2, idea,
Новый проект: Alt+F, N
Create project from scratch, Next
Name: AmazingProj
все по дефолту, Select Type: Maven Module, Next
GroupId: com.mycompany.AmazingProj
ArtefactId: AmazingProj
Version: 1.0
Create from archetype: flexmojos-archetype-application, Finish
Откроем корневой pom, напишем там:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.AmazingProj</groupId>
<artifactId>AmazingProj</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<properties>
<fdk.version>3.5.0.12683</fdk.version>
<fp.version>9.0.124</fp.version>
</properties>
<build>
<sourceDirectory>src/main/flex</sourceDirectory>
<testSourceDirectory>src/test/flex</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>3.5.0</version>
<extensions>true</extensions>
<dependencies>
<dependency>
<groupId>com.adobe.flex</groupId>
<artifactId>compiler</artifactId>
<version>${fdk.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>flex-framework</artifactId>
<version>${fdk.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.adobe.flexunit</groupId>
<artifactId>flexunit</artifactId>
<version>4.0-rc-1.1</version>
<type>swc</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.adobe.flexunit</groupId>
<artifactId>uiRunner</artifactId>
<version>4.0-rc-1.1</version>
<type>swc</type>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Проверим: mvn install, BUILD SUCCESSFUL
Добавим модуль:
Alt+1, Alt+Insert, New Module, Create module from scratch, Next
Name: TheBestOne, Type: Maven Module, Next
ArtifactId: TheBestOne, create from archetype: flexmojos-archetype-plugin, Finish
Редактируем pom модуля
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>com.mycompany.AmazingProj</groupId>
<artifactId>AmazingProj</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>TheBestOne</artifactId>
<packaging>swf</packaging>
<build>
<plugins>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<configuration>
<sourceFile>TheBestOne.mxml</sourceFile>
<configurationReport>true</configurationReport>
</configuration>
</plugin>
</plugins>
</build>
</project>
Тут два отличия от swc модулей, которые мы делали в CommonLibs. Во-первых, указываем packaging swf вместо swc, во-вторых в блок configuration добавляем
Кстати, этот класс нужно создать :) Создаем его в папке TheBestOne/src/main/flex. И пишем там что-то вроде этого:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Label text="Hello"/>
</mx:Application>
Теперь самое время нажать Import Changes и запустить mvn install для уверенности, что все ок.
Потом заглянем в папку TheBestOne/target, увидим там TheBestOne-1.0.swf, запустим во флэш плеере -- все ок :)
А давайте сразу сделаем, чтобы флэшка запускалась из IDEA.
Alt+1 (Project panel), выделяем TheBestOne.mxml, контекстное меню, Create "TheBestOne"
диалог Create Run/Debug configuration. Ничего настраивать не надо, сразу жмем ОК
Потом Shift+F9 -- Debug или Shift+F10 -- Run
наша флэшка компилируется и запускается в браузере.
Ну вот, все ок. И сейчас самое время подключить и использовать модули из проекта CommonLibs.
В pom модуля TheBestOne добавляем блок:
<dependencies>
<dependency>
<groupId>com.mycompany.CommonLibs</groupId>
<artifactId>MegaLib</artifactId>
<version>1.0</version>
<type>swc</type>
</dependency>
<dependency>
<groupId>com.mycompany.CommonLibs</groupId>
<artifactId>SuperLib</artifactId>
<version>1.0</version>
<type>swc</type>
</dependency>
</dependencies>
Жмем Import Changes. Я говорил, что Enable Auto Import лучше не нажимать? Ну сейчас говорю -- не стоит. Настройки проекта будут переконфигурироваться при каждом изменении в pom, это все будет тормозить, и редактировать pom будет сущим мучением. Лучше самому нажимать Import Changes, выполнив все нужные изменения в pom, чтобы они применились.
В TheBestOne.mxml добавляем код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import com.mycompany.CommonLibs.MegaLib.MegaExtraUtil;
import com.mycompany.CommonLibs.SuperLib.SuperPuperUtil;
]]<</mx:Script>
<mx:Label text="{MegaExtraUtil.mult(4, 5)}"/>
<mx:Label text="{SuperPuperUtil.sum(4, 5)}"/>
</mx:Application>
Shift+F9 -- все ок.
Ну вот, у нас есть очень хороший проект и очень хорошая библиотека. Они безусловно побьют продукты конкурентов. Правда в одиночку мы с этим не справимся. Не беда, у нас же есть тим из N разработчиков. Сейчас они все подключатся к работе, и мы мигом все сделаем.
Для начала надо бы положить проекты под контроль версий.
Открываем проект CommonLibs.
Меню: Version Control, Share Project (Subversion)
Ах черт, не хочется это комитить в рабочий репозиторий моей компании. А давайте-ка побыстрому установим subversion локально.
# /bin/su
$ yum install subversion
Package subversion-1.6.9-1.fc12.i686 already installed and latest version
Nothing to do
Во как? ну ок.
Создаем папку для репозитория
# cd
# mkdir rep
Создаем репозиторий в домашнем каталоге root. Ну пусть будет там :)
# svnadmin create rep
Настраиваем репозиторий
# vim rep/conf/svnserve.conf
читаем комменты, снимаем комментарии со сторок
password-db = passwd
authz-db = authz
остальное по вкусу
Настраиваем доступ
# vim rep/conf/passwd
читаем комменты и добавляем пользователя yura с паролем yura
# vim rep/conf/authz
читаем комменты и разрешаем пользователю yura доступ ко всему репозиторию на чтение и запись
[/]
yura = rw
* =
запускаем svn сервер
# svnserve -d -r ./rep/
переключаемся с root на yura -- Ctrl+D
пробуем заглянуть в репозиторий
$ svn list svn://localhost/
Просит пароль, пишем. Спрашивает, сохранить ли пароль в зашифрованом виде? yes
Сохраняет, ничего не показывает, ибо в репозитории пусто.
Ну а теперь IDEA, проект CommonLibs.
Меню: Version Control, Share Project (Subversion)
диалог Select Parent Location
добавляем репозиторий svn://localhost, пароль не спрашивают, ибо мы уже вводили его из консоли и сохранили в кеше (где-то в папке ~/.subversion)
Поскольку мы не хотим пихать проект прямо в корень репозитория, то надо создать там папку CommonLibs/trunk.
Контекстное меню на svn://localhost, New, Remote Folder, CommonLibs, Commit Message: "Create folder for CommonLibs", ОК.
Жаль, что нельзя сразу создать две папки. Поэтому опять, контекстное меню на svn://localhost/CommonLibs, New, Remote Folder, trunk, commit message тот же, ОК.
Выделяем папку svn://localhost/CommonLibs/trunk, жмем Share.
Subversion Working Copy Format: 1.6, OK
Ну и что сейчас в репозитории? svn://localhost/CommonLibs/trunk/CommonLibs. Вот поэтому я и не люблю gui -- мало того, что не хотела создавать две папки за раз, так еще потом создала лишнюю папку, которую я не просил. Удаляем нафиг и дальше из консоли. Хорошо хоть IDEA не стала сразу файлы заливать, а то ведь далеко не все заливать надо.
Недавно холиварили на жуйке по поводу консоль vs gui при работе с svn. Что-то линк не нашел, подскажите плз :) Мое мнение: update, commit из лучше из консоли; рефакторинги из IDE, ибо она сама сделает все нужные svn move; histofy, diff -- из IDE.
Кстати, вот кое что полезное из ~/.bashrc
alias ss='svn status'
alias su='svn update --set-depth=infinity'
alias sc='svn commit -m '
alias si='svn propedit svn:ignore '
alias sd='svn diff -r HEAD '
Ну поехали дальше:
$ cd ~/p/CommonLibs
$ ss
Bидим, что папка .idea и все ее содержимое уже помечено для добавления в репозиторий. iml-файлы тож помечены. Хорошо хоть target директории не помечены. Гадство. Ясное дело, что .idea/ *.iml и target коммитить нельзя. Почему? Потому что это настройки проекта IDEA, и они будут свои у каждого разработчика. Ну а target, это вообще временные каталоги для результатов сборки.
Что ж, это все надо отменить
$ svn revert --depth infinity .idea
$ svn revert CommonLibs.iml
$ svn revert MegaLib/MegaLib.iml
$ svn revert SuperLib/MegaLib.iml
$ ss
Видим, что теперь ничего лишнего не коммитится. Но висят знаки '?'. Надо прописать ignore.
$ si .
.idea
*.iml
$ si MegaLib
target
*.iml
$ si SuperLib
target
*.iml
Ну теперь можно и комитить
$ sc "put CommonLibs project to repository"
Готово :)
Нужно еще положить под контроль второй проект. Сейчас сразу будем все делать из консоли, ибо нефиг связываться с этими кривыми gui :)
$ cd ../AmazingProj/
$ svn mkdir --parents svn://localhost/AmazingProj/trunk
$ svn checkout svn://localhost/AmazingProj/trunk/ .
$ svn add pom.xml
$ svn add TheBestOne
$ svn revert TheBestOne/TheBestOne.iml
$ svn revert --depth=infinity TheBestOne/target
$ si .
.idea
*.iml
*config.xml
$ si TheBestOne
target
*.iml
$ sc "add AmazingProj to repository"
Эх, вот нет под рукой другой машины. Свой второй ноут отдал маме, она пожелала освоить компьютер (поставил там для нее Debian, ибо у меня рука не подымется терзать маму виндой :)
Ну не беда, мы сейчас просто закроем эти проекты в IDEA, удалим эти папки, а потом подымем из репозитория.
$ rm -rf CommonLibs
$ rm -rf AmazingProj
$ svn checkout svn://localhost/CommonLibs/trunk/ CommonLibs
$ svn checkout svn://localhost/AmazingProj/trunk/ AmazingProj
Созвращаемся к нашей IDEA. Create New Project. Import project from external model (а раньше мы выбирали Create project from scratch). Next. Maven. Next. Root Directory -- указываем наш CommonLibs, Next. Select Profiles: flex-mojos, Next. Select Maven project to import: com.mycompany.CommonLibs:CommonLibs:1.0, Next, Finish.
Открываем корневой pom, жмем Import Changes. mvn install. Проект готов.
UPD Оказывается создавать проект таким образом не нужно. IDEA может открыть pom-файл как проект, и из него все сгенерировать. Правда это будет проект устаревшего типа, но его сразу можно конвертировать в новый формат.
Тоже самое для второго проекта.
PROFIT.
Comments
Anonymous (not verified)
Sun, 01/09/2011 - 18:46
Permalink
тыкаюсь дальше
Ну что же. Я осилил и эту главу.
Во первых, нужно сказать что Idea несколько привередлива и попытка скомпилировать наш swf c помощью Shift + F9 не удавалось до тех пор пока я не определил переменную M2_HOME в переменных окружения Windows, которая по факту ссылалась на корень с maven3. Во вторых на этапе тестирования пришлось в те же переменные окружения добавить путь к FlashPlayer.exe, потому что мавен отчаянно пытался выплюнуть через нее наш swf, в ином случае выдавал Build Failed. В связи с чем непонятно зачем тогда мы указываем версию плеера в корневом pom и зачем мавен качает ее с репозитория flexmojos.
Что же касается репозитория, то поскольку мы собираем проект через Idea а не через командную строку, то и здесь следовало бы все делать через идею, даже если руки очень чешутся.
Тем более, насколько я понял, вы предполагаете создавать пакет trunk в каждом проекте тогда как Idea ожидает от вас получить ссылку на единственный trunk репозитория и уже в нем заботливо создавать пакеты для каждого проекта в отдельности.
Чтобы не работать в командной строке, после того как мы нажали share у нас есть возможность пройтись по дереву и ревертировать ненужные папки и iml файлы из idea, хотя я пока не знаю как именно.
Единственное что пока непонятно как отменить связку с репозиторием. Вернуть окно Version Contol в исходное состояние, после того как мы уже однажды выбрали share.
Add new comment