Flexmojos + Intellij IDEA Workflow

Сейчас будет не так много про 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.mxml. Это главный класс модуля.

Кстати, этот класс нужно создать :) Создаем его в папке 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;

		]]&lt;</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

Ну что же. Я осилил и эту главу.

Во первых, нужно сказать что 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

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.