Gradle - получение последней версии зависимости


93

Как проще всего сказать Gradleследующее:

Получите зависимость junit и возьмите ее последнюю версию.

Управление репозиториями Maven и Ivy для меня в новинку. Я попробовал выполнить следующие шаги, и они привели к Could not resolve dependency ...ошибке:

  • Пишите, задав дляcompile "junit:junit:latest.release" репозиториев только значение mavenCentral() (однако, это сработает, если я скажу «junit: junit: 4.10»).

  • Запись compile "junit:junit:latest.release"с репозиторием, установленным следующим образом:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
  • Попытка использовать репозиторий Spring Source Ivy:

    ivy {
        artifactPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
        ivyPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
    }

Может я что-то неправильно понял. Почему получение последней версии зависимости было такой сложной задачей?


Динамическая версия может использоваться вместо последней доступной версии latest.integration. документация gradle для динамических версий
Бхавик

Ответы:


49

Gradle в настоящее время не поддерживает Maven RELEASE(который редко используется и устарел), но поддерживает Ivy latest.release. Однако общая рекомендация - строить на точных версиях. В противном случае сборка может превратиться в лотерею.


Maven также не поддерживает RELEASE. Только фиксированные номера версий.
khmarbaise

10
Я дважды проверил. Maven поддерживает RELEASEкак версию 2, так и версию 3.
Питер Нидервизер,

Ты прав. Я ошибся с версиями плагинов, потому что для Maven 3 он больше не позволяет RELEASE / LATEST. Но, конечно, использовать такие идентификаторы версий - плохая практика.
khmarbaise

Артефакт в репозитории Maven Release - это тот, который прошел все возможные автоматизированные (и, возможно, ручные) тестирования. Этот процесс должен включать проверки совместимости API, регрессионное тестирование и т. Д. Почему же тогда сборка может стать лотереей? Только если вы «выпускаете» артефакты, которые не были достаточно протестированы.
RCross

2
Оценка поддерживает "latest.release" (но не "RELEASE"). Это чрезвычайно полезно для обеспечения того, чтобы ваши собственные внутренние библиотеки были самой последней, проверенной версии - я, конечно, никогда не буду защищать ее использование для внешних / сторонних библиотек по той же причине, что Питер предлагает выше.
RCross

257

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

Вы можете получить последнюю версию, например

compile "junit:junit:+"

или лучше указать хотя бы основную версию, например

compile "junit:junit:4.+"

28
для протокола: это действительно должны быть двойные кавычки! Я использовал одинарные кавычки для большинства своих объявлений зависимостей и обнаружил, что code 'junit:junit:4.+'это не работает
azonli

1
@azonli Кажется, у меня работает с одинарными кавычками, по крайней мере, для локальных зависимостей. Какая у вас ошибка?
Дэвид Моулс

3
Разве это не должно быть "testCompile" вместо "compile"? потому что артефакт не нужен в выпуске
Мартин Дюрмайер

6
Не всегда нужна воспроизводимая сборка.
Лакатош Дьюла,

2
@SimonForsberg ... Правда, однако , когда вы недоразвитие вы можете (а) следить за передним краем или (б) обеспечить исправления ошибок для V 4.+сохраняются до настоящего времени для вашего проекта. Когда вы достигнете стадии Alpha, Beta, -RC или -RELEASE; Я полностью согласен, что вам нужно « прибить » эти версии к столбу. Я использую properties' file to set version specifiers: компиляцию "junit: junit: $ { junitVer }" `.
будет

25

Проверьте Gradle-Versions-Plugin. Он делает именно то, что вы хотите: https://github.com/ben-manes/gradle-versions-plugin

Для установки смотрите страницу github. По сути, вам нужно добавить эти две строки в ваш build.gradle - файл проекта:

apply plugin: 'com.github.ben-manes.versions'

buildscript {
    [...]
    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.8'
        [...]
    }
}
[...]

Затем вы можете использовать плагин, выполнив эту команду в терминале в каталоге вашего проекта:

./gradlew dependencyUpdates -Drevision=release

И он покажет вам, какие зависимости устарели!


Вы также можете добавить это в сценарий инициализации, если не хотите включать плагин в каждый из ваших проектов. Подробнее см. Этот ответ на другой вопрос .
Лоуренс Гонсалвес,

что, если зависимости находятся в одном репо, а вам всегда нужна последняя версия?
Барри Келли

8

В последнем руководстве пользователя Gradle упоминаются и объясняются версии с плюсом:

Начиная с 7.2. Объявление ваших зависимостей :

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

... В сценарии сборки также указано, что для компиляции тестов проекта требуется любой junit> = 4.0.

С 23.7. Как работает разрешение зависимостей :

Если зависимость объявлена ​​как динамическая версия (например, 1. +), Gradle разрешит ее до новейшей доступной статической версии (например, 1.2) в репозитории. Для репозиториев Maven это делается с помощью файла maven-metadata.xml, а для репозиториев Ivy - с помощью списка каталогов.


1
Важный совет: знак + не обязательно означает последнюю версию. См. Мой комментарий выше.
Гарри Г.

3

В Android Studio:

Если вы используете +эту версию и хотите узнать, какая версия используется на самом деле , выберите Projectна боковой панели, а затем под External Librariesвы увидите фактический номер используемой версии.


Вы имеете в виду конкретную IDE? :-)
Inego

Inego: да, я добавил это в ответ ;-)
lenooh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.