Nexus - чому не потрібно використовувати latest

Nexus - чому не потрібно використовувати LATEST

Article available on: Русский English

Скрізь, де мені доводилося працювати з Sonatype Nexus в якийсь момент виникало непорозуміння про те що таке LATEST версія артефакту і чому її не можна використовувати.

Будь-артефакт має деякий інформаційним файлом maven-metadata.xml. вміст якого приблизно таке:

Це відбувається через алгоритму, який використовує Nexus для знаходження LATEST: спочатку дивиться якщо в maven-metadata.xml є і повертає його. Якщо тега немає, то повернеться остання версія в списку .

Спочатку механізм цей працює лише тому, що в maven-metadata.xml просто немає . Версії відсортовані в порядку додавання, повертається остання. Але в якийсь момент відбувається щось з двох:

Хтось таки проставляє в мета-файл.

Робота йде в гілках і дві команди незалежно один від одного заливають артефакти з різними версіями. Хто залив останній - того і остання версія. Просто-напросто в кінець додається та версія, яка зараз деплоітся.

Як виявляється в Nexus LATEST працює правильно тільки для плагінів і використовувати цей механізм для звичайних артефактів не можна.

Кілька очікуваних питань:

Хто оновлює maven-metadata.xml?

Цей файл оновлюється НЕ Nexus'ом, а Maven Deploy Plugin'ом: спочатку він забирає зі сховищ існуючий maven-medatadata.xml. потім оновлює інформацію і заливає назад в репозиторій. Якщо існуючого файлу немає, створюється новий і заливається в Nexus.

Звідки береться якщо Maven його ніяк не використовує?

Maven цей тег і не проставляє. У Nexus'a є якісь утилітарні механізми, серед таких - Rebuild Metadata. Цей пункт можна знайти в контекстному меню репозиторіїв і каталогів. Цей механізм видаляє існуючу maven-metadata.xml. переглядає артефакти і створює новий файл. І в цей момент він створює . Для чого - хрін знає, але створює. Причому я помічав навіть в тому випадку, коли Rebuild Metadata ніби як і не робився, тому є підозри що це відбувається ще з якихось подій. Майте на увазі, що сортування версій відбувається виходячи з механізмів зошитах в Maven. а ці механізми вже використовуються Nexus'ом:

The ordering is derived by parsing the version string and supports sematic versioning with additional semantics for specific classifiers. Further details can be found in the documentation for the implementing class GenericVersionScheme.

чому застаріває?

Навіть якщо Rebuild Metadata і відбувається, то це разова дія. Далі метадата-файл оновлювати все одно буде Maven. А той просто нічого не робить з - вона копіюється з того maven-metadata.xml. який був завантажений з Nexus'a.

Підведемо підсумки

Якщо вам потрібен механізм отримання останньої версії артефакту, цей механізм ви самі і повинні будете створити (написати скрипт). Механізм, який використовується Nexus'ом за замовчуванням в якийсь момент просто перестане працювати.

До того ж якщо ви вважаєте вам потрібна десь остання версія артефактів, скоріше за все ви рухаєтеся в неправильному напрямку, мені не доводилося бачити добре поставлені процеси де була потреба в LATEST.

а взагалі не варто тягнути останні версії артефактів бездумно, світ не досконалий і люди тим більше, баги правляться, а й нові з'являються, і не варто додавати в проект сторонні баги автоматом :)

Схожі статті