Nexus, Server-side.

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://repository.flyti.org/, иначе репозиторий 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 -- интересная, но не исследованная сторона :)

Comments

Скажите правильно ли я понимаю, что Nexus нужно разворачивать только в локальной сети и в нем нет необходимости в том, случае если группа разработчиков работает над проектом удаленно ?

Я не совсем понял зачем группе разработчиков иметь исходники всех модулей, и каждому разработчику все это заново перекомпилировать ?!

Предположим я делаю приложение на основе pureMVC и у меня в команде два разработчика, мы работаем в основном в офисе, но часто путешествуем и потому периодически что то пишется удаленно на ноутбуках. Один зазработчик пишет библиотеку для взаимодействия с сервером (swc), предположим через сокет и сервер side, второй пишет user intreface, красивые но глупенькие вью(swf), которые через notifications pureMVC слабо связанны с библиотекой. А я загружаю их на этапе исполнение в конечный проект.

Насколько я понимаю для этого одному разработчику нужно только выкладывать новые версии своей библиотеки в репозиторий, второму указать зависимость от текущей версии в головном pom и коммитить свои вьюшки, а мне в свою очередь подбирать только указать зависимость от текущих версий swf.

Можете привести пример когда требуется задействовать ant? И можно ли сделать так чтобы на стадии deploy мавен просто делал commit текущей версии собранных swc порученных разработчику в репозиторий ?!

yzh44yzh's picture

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

Он не обязательно работает только в локальной сети, может работать и в интернете. Да что там, все публичные репозитории -- это нексус сервера.

И можно ли сделать так чтобы на стадии deploy мавен просто делал commit текущей версии собранных swc порученных разработчику в репозиторий ?!
Оно так и происходит. mvn install кладет артефакты в локальный репозиторий на данной машине, mvn deploy кладет артефакт в удаленный репозиторий (в нексус), после чего он доступен другим разработчикам.

Что - то я совсем запутался.

Если взять ваше утверждение за основу то теоретически мы должны иметь возможность при условии, что у нас есть логин пароль, при вводе в адресной строке какого либо публичного репозитория попадать в repository management этого репозитория.

например так: http://gaiaframework.googlecode.com:8081/nexus

Но, к сожалению никакой административной панельки nexus не вылазит.

Не подумайте что я придираюсь, вы чуть ли не единственный человек, у которого получается объяснить интеграцию maven + idea + flexmojos. Просто здесь есть явное противоречие:
Допустим в моей компании есть сервер FreeBSD и на нем стоит subersion все разработчики раньше просто выкачивали с помощью той же tortouseSVN новые версии программного кода и компилировали приложение. Если приложение модульное и разработчику нужен не исходник какой либо библиотеки, а уже готовый модуль то, тогда он просто обновлял саму swf либо swc библиотеку. Идея как я понял позволяет делать тоже самое из под себя. Теперь появляется nexus и не совсем понятно что с ним делать? Просто разворачивать на сервере, в поме проекта связать проект с репозиторием и забыть про subversion ?! Просто собирать проект и деплоить его ?!

yzh44yzh's picture

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

Нексус и subversion занимаются разными вещами. Subversion хранит исходники, nexus -- артефакты, получаемые из этих исходников.

Понятно, что swc-библиотеки можно хранить и в Subversion, но это не maven way.

Попробую объяснить, в чем разница.

Допустим у тебя есть проект А, который содержит одну или несколько swc библиотек. Эти библиотеки используются в 5-ти других проектах.

Если у тебя нет нексуса, то ты кладешь скомпилированые swc куда? В svn репозиторий проекта А. И когда другому разработчику нужно работать по проекту B, он должен взять из репозитория и проект А и проект В. И настроить проект В так, чтобы он брал swc из проекта А. Ну пока все ок.

Далее, разработчик берет проект С, и в нем тоже настраивает зависимость от либы в проекте A.

Потом оказывается, что либу нужно немного доработать. Дорабатываем, комитим, обновляем -- все ок, проект С работает с новой версией либы. И вдруг оказывается, что проекту В нужна старая версия, с новой он не собирается, и теперь нужно фиксить проект В.

Пока у нас 2 проекта, с этим еще можно справиться. Когда у нас 10 разных проектов, и все используют разные версии либы, то тут приходит полная жопа.

Ок, пытаемся справиться с жопой, и в каждый проект копируем swc файл. Стало быть, в каждом проекте лежит именно именно такая версия swc, с которой он может работать.

Но плохо то, что мы теперь не знаем, где какая версия. Либа разбросана по 10-ку проектов, где-то она более старая, где-то более новая. И мы теперь не знаем, какой функционал и какой API актуален в данном конкретном swc файле.

Ну вот, как-то так. А суть maven -- не только управление артефактами, но и управление версиями. Проекты зависят не просто от либы, а от конкретной версии этой либы.

С нексусом оно так -- ты работаешь по проекту А, обновляешь либу, меняешь ей номер версии и деплоишь ее в нексус. После этого проект В работал как и раньше, с предыдущей версией. А в проекте С ты чутка поправишь зависимость в pom-файле, укажешь новую версию, и при сборке maven сам возьмет нужный swc из нексуса.

Все это актуально, когда у вас поддерживаются и разрабатываются несколько проектов, которым много лет, и из-за этого они зависят от разных версий одних и тех же либ.

Да теперь понятно. Осталось одна неясность: Отношения maven и nexus.

Поправьте если я ошибаюсь, фактически роль центрального репозитория артефактов выполняет maven, развернутый на сервере. А nexus это просто некий клиент (коммерческое приложение), работающий с репозиторием через удобную админку. То есть по факту если бы nexus быль платным и дорогим ПО (или когда-нибудь станет таковым), то мы сможем связать наше приложение с мавеном развернутом на сервере и не использовать nexus либо использовать какую - либо альтернативу ему. Или же nexus это обязательное связующее звено между центральным хранилищем maven на сервере и средой разработки (идея + flexmojos плагин).

yzh44yzh's picture

Наоборот -- Nexus -- это сервер, центральное хранилище артефактов. А Maven -- клиент к нему.

Только Maven может работать и без Nexus, с локальным (на машине разработчика), а не центральным хранилищем артефактов.

Все-таки рекомендуется сперва ознакомится с матчастью http://www.sonatype.com/books.html

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.