Стремясь достичь высокой модульности и реюзабельности кода, мы дробим проект на кучу мелких модулей, и получаем кучу 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 проекта.
Эта часть для вас, вероятно, будет малоинформативна. Ибо она не про 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
Anonymous (not verified)
Sun, 01/09/2011 - 18:49
Permalink
Скажите правильно ли я
Скажите правильно ли я понимаю, что Nexus нужно разворачивать только в локальной сети и в нем нет необходимости в том, случае если группа разработчиков работает над проектом удаленно ?
Я не совсем понял зачем группе разработчиков иметь исходники всех модулей, и каждому разработчику все это заново перекомпилировать ?!
Предположим я делаю приложение на основе pureMVC и у меня в команде два разработчика, мы работаем в основном в офисе, но часто путешествуем и потому периодически что то пишется удаленно на ноутбуках. Один зазработчик пишет библиотеку для взаимодействия с сервером (swc), предположим через сокет и сервер side, второй пишет user intreface, красивые но глупенькие вью(swf), которые через notifications pureMVC слабо связанны с библиотекой. А я загружаю их на этапе исполнение в конечный проект.
Насколько я понимаю для этого одному разработчику нужно только выкладывать новые версии своей библиотеки в репозиторий, второму указать зависимость от текущей версии в головном pom и коммитить свои вьюшки, а мне в свою очередь подбирать только указать зависимость от текущих версий swf.
Можете привести пример когда требуется задействовать ant? И можно ли сделать так чтобы на стадии deploy мавен просто делал commit текущей версии собранных swc порученных разработчику в репозиторий ?!
yzh44yzh
Sun, 01/09/2011 - 18:50
Permalink
Без Нексус каждый разработчик
Без Нексус каждый разработчик должен будет сам собрать каждый артефакт из исходников. Нексус позволяет этого не делать, а обмениваться уже готовыми артефактами.
Он не обязательно работает только в локальной сети, может работать и в интернете. Да что там, все публичные репозитории -- это нексус сервера.
И можно ли сделать так чтобы на стадии deploy мавен просто делал commit текущей версии собранных swc порученных разработчику в репозиторий ?!
Оно так и происходит. mvn install кладет артефакты в локальный репозиторий на данной машине, mvn deploy кладет артефакт в удаленный репозиторий (в нексус), после чего он доступен другим разработчикам.
Anonymous (not verified)
Sun, 01/09/2011 - 18:50
Permalink
Что - то я совсем запутался.
Что - то я совсем запутался.
Если взять ваше утверждение за основу то теоретически мы должны иметь возможность при условии, что у нас есть логин пароль, при вводе в адресной строке какого либо публичного репозитория попадать в repository management этого репозитория.
например так: http://gaiaframework.googlecode.com:8081/nexus
Но, к сожалению никакой административной панельки nexus не вылазит.
Не подумайте что я придираюсь, вы чуть ли не единственный человек, у которого получается объяснить интеграцию maven + idea + flexmojos. Просто здесь есть явное противоречие:
Допустим в моей компании есть сервер FreeBSD и на нем стоит subersion все разработчики раньше просто выкачивали с помощью той же tortouseSVN новые версии программного кода и компилировали приложение. Если приложение модульное и разработчику нужен не исходник какой либо библиотеки, а уже готовый модуль то, тогда он просто обновлял саму swf либо swc библиотеку. Идея как я понял позволяет делать тоже самое из под себя. Теперь появляется nexus и не совсем понятно что с ним делать? Просто разворачивать на сервере, в поме проекта связать проект с репозиторием и забыть про subversion ?! Просто собирать проект и деплоить его ?!
yzh44yzh
Sun, 01/09/2011 - 18:51
Permalink
Насчет того, что все
Насчет того, что все публичные сервера работают под нексус я мог и соврать, точно не знаю. Но не суть.
Нексус и 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 из нексуса.
Все это актуально, когда у вас поддерживаются и разрабатываются несколько проектов, которым много лет, и из-за этого они зависят от разных версий одних и тех же либ.
Anonymous (not verified)
Sun, 01/09/2011 - 18:52
Permalink
Да теперь понятно. Осталось
Да теперь понятно. Осталось одна неясность: Отношения maven и nexus.
Поправьте если я ошибаюсь, фактически роль центрального репозитория артефактов выполняет maven, развернутый на сервере. А nexus это просто некий клиент (коммерческое приложение), работающий с репозиторием через удобную админку. То есть по факту если бы nexus быль платным и дорогим ПО (или когда-нибудь станет таковым), то мы сможем связать наше приложение с мавеном развернутом на сервере и не использовать nexus либо использовать какую - либо альтернативу ему. Или же nexus это обязательное связующее звено между центральным хранилищем maven на сервере и средой разработки (идея + flexmojos плагин).
yzh44yzh
Sun, 01/09/2011 - 18:52
Permalink
Наоборот -- Nexus -- это
Наоборот -- Nexus -- это сервер, центральное хранилище артефактов. А Maven -- клиент к нему.
Только Maven может работать и без Nexus, с локальным (на машине разработчика), а не центральным хранилищем артефактов.
Все-таки рекомендуется сперва ознакомится с матчастью http://www.sonatype.com/books.html
Add new comment