Как использовать Ivy / Ant для сборки с использованием промежуточных артефактов

#ivy

#ivy

Вопрос:

Я пытаюсь пересмотреть свой процесс сборки, чтобы использовать ant с apache ivy для моих личных проектов. Они состоят из нескольких общих модулей и нескольких прикладных модулей, которые зависят от общих модулей. Ради этого поста давайте упростим и скажем, что у меня есть общий модуль ( common ) и модуль приложения ( application ), который зависит от common . Каждый модуль имеет свой собственный эффективный репозиторий svn:

 svn_repo_1/common/trunk
                 /branches
                 /tags
svn_repo_2/application/trunk
                      /branches
                      /tags
  

Я проверяю соответствующую редакцию в общей рабочей области в плоской структуре:

 workspace/common
workspace/application
  

В общем, application это будет зависеть от опубликованной версии common , поэтому при сборке common не будет необходимости в сборке. ………. application

Однако, когда мне нужно добавить новую функциональность к common тому, что требуется application , я хотел бы application зависеть от последней common сборки из моей рабочей области (без необходимости публиковать common в моем репозитории).

Я предположил, что это то, что latest.integration имелось в виду (т. е. изменение application ivy.xml указать latest.integration для общей ревизии). Я намеревался использовать задачу ivy buildlist для поиска локальных модулей, которые необходимо было собрать перед сборкой приложения. Однако это не работает, поскольку buildlist задача, похоже, включает common/build.xml запись независимо от того, является ли приложение ivy.xml в файле указывается последняя версия.integration или какая-либо другая опубликованная редакция.

Я был бы признателен за любые предложения. Я испытываю трудности с документацией и примерами ivy, поэтому любые примеры из реального мира также были бы полезны. Примечание: Меня здесь не интересует решение Maven.

Ответ №1:

Вау, это действительно дежавю! Вернитесь к некоторым из моих первых вопросов на этом сайте 3-4 месяца назад, и почти все они связаны с Ivy! Я на 100% разделяю ваше мнение о том, что Ivy — сложный зверь для изучения и приручения, но после профессионального использования в течение нескольких месяцев я больше никогда не буду развиваться без него. Итак, мой первый совет: продолжайте. Рано или поздно та небольшая (практическая) документация, которую вы найдете на Apache Ivy, начнет приобретать смысл и попадет в игру.

Я могу понять, что могут быть смягчающие причины, по которым вы не хотите публиковать свой common в своем репозитории. Однако, если вы новичок в управлении переходными зависимостями, первый практический совет, который я могу вам дать, заключается в том, что вы должны всегда публиковать свои JARS / WARs / что угодно в своем репозитории; не промежуточная «интеграция», локальная для вашего рабочего пространства.

Причина этого проста: Ivy имеет возможность обхода репозиториев, которые вы определяете в своем файле настроек (в основном). Если вы намеренно сохраняете JAR like common за пределами одного из этих определенных репозиториев, то: (а) у Ivy нет способа разрешить транзитивные зависимости (его основная задача), и (б) «нижестоящие» (зависимые) JAR не могут динамически обновляться при каждой настройке common . Таким образом, использование Ivy только для того, чтобы не публиковать JARS, немного контрпродуктивно; Я удивлен, что Ivy даже включает это в качестве функции.

Думаю, мне нужно было бы понять вашу мотивацию отказа от публикации common . Если у вас просто возникли проблемы с выполнением ivy:publish задачи, не беспокойтесь, я могу предоставить множество примеров, которые помогут вам начать. Но если есть какие-то другие причины, то я прошу вас рассмотреть это решение: настройте несколько репозиториев.

Возможно, у вас есть один «первичный» репозиторий, где публикуется в основном все; и затем у вас есть «вторичный» или «промежуточный» репозиторий, где вы публикуете common всякий раз, когда это имеет смысл (для вас) делать это. Затем вы можете настроить сборку Ant с помощью двух разных задач публикации, таких как публикация-основная и публикация-интеграция.

Таким образом, вы получаете лучшее из обоих миров: вы получаете промежуточную промежуточную область и можете держать все под мощным контролем Ivy.

Комментарии:

1. Спасибо за ответ. Моя причина нежелания common публиковаться при сборке промежуточных сборок заключается в том, что я использую ivysvn для своего основного репозитория, поэтому опубликованные артефакты регистрируются в отдельном репозитории svn. Мне не нужна common-latest.integration. jar постоянно фиксируется. Мне нравится, как звучит ваше предложение о нескольких репозиториях. Смогу ли я разрешить проблему с использованием обоих репозиториев, чтобы артефакты сторонних разработчиков в моем основном репозитории ivysvn разрешались оттуда, в то время как мой common-latest.integration.jar разрешается из локального репозитория каталогов?