Maven и Flexmojos Часть 7. Nexus, Server-side.

2010-03-08 19:05:00

Nexus

Стремясь достичь высокой модульности и реюзабельности кода, мы дробим проект на кучу мелких модулей, и получаем кучу swc файлов. Естественно, оперировать ими вручную было бы хреново -- попробуйте подключить к проекту 30 swc, лежащих в разных местах. К счастью, делать это совершенно не нужно -- обо всем заботится Maven. Все swc файлы лежат в локальном репозитории ( ~/.m2/repository ) и легко подключаются куда угодно указанием зависимости.

Однако проблема решается только на уровне одного разработчика. В команде все немного сложнее. Тут выходит, что каждый разработчик должен скомпилировать на своей машине все артефакты, которые ему нужны. К примеру, если Вася сделал изменения в какой-то внутренней библиотеке, которая используется в 5 проектах, то другие разработчики, работающие по этим 5 проектам, должны иметь у себя сорцы этой библиотеки, чтобы их обновить и перекомпилировать. А ведь гораздо проще было бы получить измененную swc и использовать ее.

Эту проблему решает Nexus -- сервер артефактов. Это такое же хранилище артефактов, как и ~/.m2/repository, но только оно не локальное, а общее внутри локальной сети компании (ну и при необходимости доступно извне). При наличии у команды Nexus-сервера, Вася делает mvn deploy для своей библиотеки, и swc становится доступным для других разработчиков. Теперь им нет надобности иметь у себя сорцы этой swc и компилировать ее.

Nexus решает еще одну проблему -- кеширует внешние публичные артефакты. К примеру, каждому разработчику в команде нужен как минимум com.adobe.flex.framework:flex-framework и несколько других зависимостей. Без Nexus каждый разработчик отдельно скачает из инета все эти артефакты. С Nexus они скачаются один раз, и будут доступны всем разработчикам из локальной сети.

Это две основные причины, по которым команде разработчиков нужен Nexus. Конечно, там есть и другие фишки. Например, навороченные права доступа и полномочия пользователей. Но это все интересно только крупным компаниям. Небольшим командам достаточно двух вышеупомянутых.

Особых проблем с Nexus нет: читаем доки, скачиваем, запускаем, настраиваем. Если пользуетесь форком Flexmojos от Develar, то добавляем репозиторий http://astra.thewebproduction.com:8081/nexus/content/groups/public/, иначе репозиторий http://repository.sonatype.org/content/groups/flexgroup/. Впрочем, можно добавить оба :)

Создаете репозиторий mycompany, где будут хранится ваши артефакты. Анонимный доступ к нему наверняка нужно будет закрыть, ибо ваши артефакты, конечно, не публичные.

У всех разработчиков в ~/.m2/settings.xml добавляем профайл:

<profile>
	<id>nexus</id>
	<repositories>
		<repository>
			<id>public</id>
			<url>http://192.168.0.102:8081/nexus/content/groups/public</url>
			<releases> <enabled>true</enabled> </releases>
			<snapshots> <enabled>false</enabled> </snapshots>
		</repository>
		<repository>
			<id>thirdparty</id>
			<url>http://192.168.0.102:8081/nexus/content/repositories/thirdparty</url>
			<releases> <enabled>true</enabled> </releases>
			<snapshots> <enabled>false</enabled> </snapshots>
		</repository>
		<repository>
			<id>flashdevs</id>
			<url>http://192.168.0.102:8081/nexus/content/repositories/mycompany</url>
			<releases> <enabled>true</enabled> </releases>
			<snapshots> <enabled>true</enabled> </snapshots>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>public</id>
			<url>http://192.168.0.102:8081/nexus/content/groups/public</url>
			<releases> <enabled>true</enabled> </releases>
			<snapshots> <enabled>true</enabled> </snapshots>
		</pluginRepository>
	</pluginRepositories>
</profile>

Делаем этот профайл активным.

Далее создаем аккаунты на Nexus сервере для каждого разработчика, указываем нужные роли. С этим у меня сперва были затруднения. Но там для примера уже создан пользователь Deployment User с нужными ролями. И вам нужно создавать такие же аккаунты, как этот.

Дальше каждый разработчик добавит в ~/.m2/settings.xml свой логин и пароль к Nexus

<servers>
	<server>
		<id>mycompany</id>
		<username>Yura</username>
		<password>123456</password>
	</server>
</servers>

Еще нужно прописать настройки distributionManagement. У нас они одинаковые для всех проектов, так что я прописал их в flex super pom

<distributionManagement>
	<snapshotRepository>
		<id>mycompany</id>
		<url>http://192.168.0.102:8081/nexus/content/repositories/flashdevs</url>
	</snapshotRepository>
</distributionManagement>

Но если они разные в разных проектах, то тогда это нужно указывать в главном pom проекта.

Немного про Server Side

Эта часть для вас, вероятно, будет малоинформативна. Ибо она не про Java :)

Типичный back end для флекс-приложений -- это Java-сервер на базе какого-либо BlazeDS или чего-нибудь иного. Но мы еще не доросли до Java, у нас все проще.

Серверная часть у нас -- это Server Side ActionScript под Flash Media Server и PHP. И то и другое -- интерпретируемые языки, не требующие компиляции и упаковки. Стало быть, тут и Maven применить негде :)

Но все-таки кое-что нужно делать. Итак, исходники серверных частей хранятся в проекте, далеко от FMS application root и web server root. А работать они должны в оных рутах. Значит их нужно туда доставлять. К тому же, их еще нужно немного конфигурировать под специфические условия на машине конкретного разработчика.

Для этой цели у нас давно написаны и успешно используются Ant-скрипты. Однако с Ant-скриптами есть два небольших неудобства. Во-первых, настройки, которые им нужны (путь к FMS appliction root и Web server root) у нас уже заданы для Maven в ~/.m2/settings.xml, а для Ant их нужно продублировать. Во-вторых, эти настройки у каждого разработчика отличаются, поэтому их опять нужно дублировать. В итоге в наших проектах сейчас можно увидеть такое:

project
- ant
  - deploy_www_yura.xml
  - deploy_www_vasya.xml
  - deploy_www_petya.xml
  - deploy_fms_yura.xml
  - deploy_fms_vasya.xml
  - deploy_fms_petya.xml

Хочется избегнуть дублирования и найти иной способ. Лучше всего, чтобы deploy-www и deploy-fms были в одном экземпляре, общие для всех разработчиков, а нужные настройки брались из конфигов Maven.

Чесно говоря, я пока ничего не делал в этом направлении. Ибо некогда, а оно и так работает. Но зато я думал, в каком направлении надо копать. И тут вижу три варианта.

1. У Maven есть стандартный goal resources:resources, с помощью которого он копирует ресурсы у нужное место, при этом парсит в них параметры, если надо. Технически это именно то, что нужно. Но идеологически, выдавать сорцы за ресурсы, это все-таки хак.

2. Maven может исполнять ant-скрипты внутри себя c помощью maven-antrun-plugin. Наверняка при этом можно использовать параметры Maven как параметры Ant (но я не уверен). Этот вариант кажется мне самым правильным. Но не окажется ли он более медленным, чем уже имеющиеся Ant скрипты? Попробую, узнаю.

3. Ну и самое низкоуровневое решение -- exec-maven-plugin. С его помощью можно запустить что угодно, любую командную сроку, в том числе и Ant-скрипты.

В общем, буду пробовать в более спокойные времена, когда не окажется более важных дел :)

На этом мои практические познания в Maven и Flexmojos исчерпаны, и тему можно закрывать (временно). В дальшейшем, по мере освоения каких-то новых сторон, буду их описывать. Вот, к примеру, Flexmojos и AIR -- интересная, но не исследованная сторона :)