Определение поведения последней интеграции в Ivy

У меня проблемы с пониманием того, как работает latest.integration.

У меня есть пример, который не дает результатов, упомянутых в: http://ant.apache.org/ivy/history/latest-milestone/tutorial/defaultconf.html

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

Мой ivysettings.xml выглядит так:

<resolvers>
<chain name="download-chain" returnFirst="false" >
    <url name="nexus-repo" m2compatible="true" >
        <artifact pattern="${nexus}/[organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]" />
        <ivy pattern="${nexus}/[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" />
    </url>
    <resolver ref="local" />
</chain>
</resolvers>

здесь я заявляю, что у меня есть репозиторий URL-адресов нексуса и ссылка на локальный адрес по умолчанию. Я использую эту цепочку, когда хочу разрешить свои зависимости.

Я создаю обозначенный артефакт и публикую его на локальном компьютере со статусом «интеграция» с ревизией «HEAD» (что-то вроде SNAPSHOT для нас), сначала используя локальный преобразователь:

<ivy:publish 
    overwrite="yes"
    update="true"
    artifactspattern="${project.dist.dir}/[artifact]-[revision](-[classifier]).[ext]" 
    resolver="local"
    settingsRef="ivy.nexus"
/>

и перестройте его снова и опубликуйте в репозитории nexus:

<ivy:publish 
    overwrite="yes"
    update="true"
    artifactspattern="${project.dist.dir}/[artifact]-[revision](-[classifier]).[ext]" 
    resolver="publish-url"
    forcedeliver="true"
    settingsRef="ivy.nexus"
/>

У меня есть другой проект, который объявляет предыдущий артефакт как зависимость от ревизии «latest.integration».

Я ожидаю, что артефакт должен быть загружен из локального репозитория независимо от порядка объявленных преобразователей. Но это не так. Загруженный артефакт всегда относится к резолверу, упомянутому первым. Изменение имени "локального" распознавателя ни на что не повлияло. Порядок всегда имеет значение.

Я пробовал добавить change = "true" к моей зависимости. Это не помогло.

В этом вопросе: Ivy: принудительный локальный снимок для зависимости

Аскер упоминает даже о другом поведении, а именно о том, что выбирается самое последнее (порядок решателей даже не имеет значения).

ТАК, чтобы завершить это и извинить за продление: Как получить артефакт:

1) всегда самая последняя. Интеграция (самая последняя) независимо от местоположения.

2) всегда локально, даже если в других местах есть более свежая версия интеграции.

3) Я настолько невежественен?


person Eyad Ebrahim    schedule 15.06.2012    source источник


Ответы (2)


Я бы порекомендовал прочитать следующий ответ о публикации артефактов в Nexus.

как публиковать сторонние артефакты с ivy и nexus < / а>

Воспользуйтесь преобразователем ibiblio, это намного проще.

Второй совет - иметь четкое разделение между сборкой интеграции и выпуском в рамках вашей логики ANT. Первый может использовать метку времени в качестве ревизии, тогда как второй должен иметь стратегию для поддержания увеличивающегося номера ревизии (это совершенно другой вопрос). Maven называет эти сборки «SNAPSHOT» или «Release» и реализует два разных типа репозиториев для их поддержки.

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

person Mark O'Connor    schedule 15.06.2012
comment
Это потребует некоторого тестирования с моей стороны, и я уезжаю в офис на выходные. Однако локальный репозиторий будет использоваться для локальной разработки, когда разработчики хотят протестировать свою текущую версию проекта A с текущей версией проекта B. Использование нексуса для этого означало бы совместное использование артефактов разработки, а это не то, что мы хотим. Я протестирую POM, и я надеюсь, что они будут вести себя более стабильно. И последнее. Пример, который вы предложили, был одним из моих руководств по этой штуке с плющом. Спасибо чувак. - person Eyad Ebrahim; 16.06.2012
comment
@EyadEbrahim Рад помочь. Для ivy, безусловно, будет проще хранить моментальные снимки разработки локально. Если Nexus используется только для выпусков, то мой последний совет - проверить задачу ivy buildnumber. Вы обнаружите, что это очень полезно для увеличения номера выпуска на основе того, что было ранее опубликовано. - person Mark O'Connor; 16.06.2012

Все-таки удалось сделать заказ незначительным.

Я не уверен, как далеко я должен был зайти, но:

Я использовал latest = "latest-time" в преобразователе цепочек, а также в преобразователе URL-адресов. Однако этого было недостаточно, и когда я отлаживал код, я обнаружил, что каждый преобразователь оценивает свое собственное «последнее». Итак, я переопределил локальный репозиторий следующим образом:

<filesystem name="local" latest="latest-time" > 
    <ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}"/>
    <artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}"/>
</filesystem>
person Eyad Ebrahim    schedule 19.06.2012