Представьте, что существует большой многомодульный проект Gradle со многими модулями: для целей этого вопроса предположим, что есть модули modA
, modB
и modC
. И modB
, и modC
используют артефакт modA
. Артефакты публикуются в репозитории Maven.
Вот требования:
- Обычно
modB
и modC
должны использовать последнюю версию modA
. Если у проекта была версия 1.0
и это изменение представляет 1.1-SNAPSHOT
, то тесты modB
и modC
должны включать тестирование против 1.1-SNAPSHOT
. Все модули, использующие зависимость, должны быть опубликованы с новой версией 1.1
. например, если modB
проходит свои тесты, но modC
не использует новую версию, тогда com.example:modA:1.1
и com.example:
modB: 1.1 would be published, but not
com.example: mod C: 1.1`. - Модули должны иметь возможность закрепления, чтобы использовать более старую версию зависимости, если новая версия этой зависимости приводит к их сбою, например,
modC
может обычно использовать implementation 'com.example:modA:1.+'
в качестве зависимости, но это должно быть прикреплено к implementation 'com.example:modA:1.0'
в результате неудачного тестирования с использованием modA:1.1-SNAPSHOT
.
Требование 2, по-видимому, указывает на то, что мы не можем использовать зависимости lib для многомодульного проекта (как подробно здесь ), потому что если есть изменение в modA
, которое приводит к сбою modC
, то в будущих сборках проекта будет использоваться новая версия modA
, когда мы должны использовать 1.0
, т.е. мы не закрепили modC
на предыдущую версию modA
. Нижестоящие проекты должны продвигаться с разной скоростью в отношении зависимостей, то есть недопустимо настаивать на том, что все они используют одну и ту же (последнюю) версию modA
, и недопустимо настаивать на том, что они все используют последнюю версию modA
, в результате которого все модули прошли соответствующие тесты.
Вопросы:
- Существует ли способ иметь несколько сборок проекта с разными версиями зависимостей (например, сборка с использованием
implementation 'com.example:modA:1.0'
и еще один с implementation 'com.example:modA:1.1-SNAPSHOT'
)? Как выполнить сборку с артефактом, который был только что собран из предыдущей задачи, когда новая версия этого артефакта не будет разрешена пока этот артефакт не был опубликован? Нужно ли запускать их как отдельные прогоны Gradle, например:
. / Gradlew: modA: publishToMavenLocal ./gradlew: modB: test
, где :modB:test
- это каким-то образом настроен на использование -SNAPSHOT
зависимостей или я могу сделать это за один прогон Gradle:
./gradlew :modA:publishToMavenLocal :modB:test
Если тесты пройдены для
modB
с использованием
modA:1.1-SNAPSHOT
, как мне записать в Maven pom для
modB
новую разрешенную версию для
modA
, то есть
modA:1.1
?
Я застрял с текущим подходом моно-репо к созданию проекта - я не могу разделить это на отдельные проекты для `каждого модуля.