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 для динамічних версій
Bhavik

Відповіді:


48

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


Maven також не підтримує RELEASE. Лише фіксовані номери версій.
khmarbaise

10
Я двічі перевірив. Maven підтримує RELEASE, як у версії 2, так і в версії 3.
Пітер Нідервізер

Ти правий. Я помилився, що з версіями плагінів, тому що для Maven 3 він більше не дозволяє ВИПУСК / ОСТАННІЙ. Але, звичайно, погана практика використовувати такі ідентифікатори версій.
khmarbaise

Артефакт у сховищі випуску Maven - це той, який пройшов усі можливі автоматизовані (і, можливо, ручні) тестування. Цей процес повинен включати перевірку сумісності API, тестування регресії тощо. Чому тоді збірка може стати лотереєю? Тільки якщо ви «випускаєте» артефакти, які не пройшли достатню перевірку.
RCross

2
Клас підтримує "latest.release" (але не "RELEASE"). Це надзвичайно корисно для гарантування того, що ваші власні внутрішні бібліотеки мають найновішу перевірену версію - я, звичайно, ніколи не буду виступати за її використання для зовнішніх / сторонніх бібліотек з тієї самої причини, яку Петро пропонує вище.
RCross

257

Іноді може бути дуже корисно отримати останній випуск - якщо, наприклад, ви часто випускаєте власні залежності.

Ви можете отримати останню версію, наприклад

compile "junit:junit:+"

або краще вказати принаймні основну версію, наприклад

compile "junit:junit:4.+"

27
просто для запису: це справді повинні бути подвійні лапки! Я використовував одинарні лапки для більшості своїх декларацій про залежність і виявив, що code 'junit:junit:4.+'це не працює
azonli

1
@azonli Здається, це працює для мене з одинарними лапками, принаймні для локальних залежностей. Яку помилку ви отримуєте?
Девід Моулз

3
це не має бути "testCompile" замість "compile"? тому що артефакт у випуску не потрібен
Мартін Дюррмайер

6
Не завжди потрібна відтворювана збірка.
Lakatos Gyula

2
@SimonForsberg ... Правда, однак, коли ви перебуваєте в стадії розробки, ви можете захотіти (а) слідувати за найсучаснішим краєм або (б) переконатися, що виправлення помилок для v 4.+постійно оновлюються для вашого проекту. Коли ви досягаєте етапу альфа, бета, -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

І це покаже вам, які залежності застаріли!


Ви також можете додати це до initscript, якщо не хочете включати плагін у кожен свій проект. Детальніше див. Цю відповідь на інше запитання .
Лоранс Гонсальвес

що робити, якщо залежності знаходяться в одному репозиторії, і ви завжди хочете останню версію?
Баррі Келлі,

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.