Диапазоны версий для зависимостей в Gradle и блокировка конкретной версии для сборки CI

#gradle #range #dependency-resolution

Вопрос:

Я пишу расширение для AsciidoctorJ, используя gradle. Мое расширение работает со всеми 2.x.x версиями AsciidoctorJ, поэтому моя идея состояла в том, чтобы объявить зависимость в виде диапазона [2.0.0, 3.0.0[ .

 dependencies {
    implementation "org.asciidoctor:asciidoctorj:[2.0.0, 3.0.0["
    // other dependencies
}
 

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


Если я работаю с файлом блокировки (см. раздел Блокировка версий зависимостей), я не понял, как я могу установить определенную версию. --update-locks не ожидайте версии:

 ./gradlew check --update-locks org.asciidoctor:asciidoctorj:2.2.0
 

Происходит сбой с этой ошибкой:

Формат блокировки обновления должен быть <group>:<artifact> , но 'org.asciidoctor:asciidoctorj:2.2.0' является недопустимым.

что и ожидается (как задокументировано).


Мой текущий обходной путь-добавить свойство проекта, которое влияет на используемую строгую версию:

 def strictAsciidoctorjVersion = hasProperty('asciidoctorjVersion') ? '!!'   getProperty('asciidoctorjVersion') : ''

dependencies {
    implementation "org.asciidoctor:asciidoctorj:[2.0.0, 3.0.0[${strictAsciidoctorjVersion}"
    // other dependencies
}
 

Это работает, как и ожидалось. Я могу бежать:

 ./gradlew build -PasciidoctorjVersion=2.2.0
 

или

 ./gradlew build -PasciidoctorjVersion=2.5.1
 

И я написал задание CI, запускающее сборку со всеми существующими версиями.

Но это решение кажется очень нестандартным. Я надеялся, что у меня будет что-то более стандартное и работа с файлами блокировки.