Gradle - obtenir la dernière version d'une dépendance

93

Quelle serait la façon la plus simple de dire Gradlece qui suit:

Récupérez la dépendance 'junit' et prenez sa dernière version 'release'.

La gestion des référentiels Maven et Ivy est une sorte de nouveau pour moi. J'ai essayé les étapes suivantes et elles entraînent une Could not resolve dependency ...erreur:

  • Ecrire compile "junit:junit:latest.release"avec des référentiels définis uniquement mavenCentral() (cependant, cela fonctionne si je dis "junit: junit: 4.10").

  • Écrivez compile "junit:junit:latest.release"avec le référentiel défini de la manière suivante:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
    
  • Tentative d'utilisation du référentiel 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]"
    }
    

Peut-être ai-je mal compris quelque chose. Pourquoi obtenir la dernière version de la dépendance serait-il une tâche si difficile?

Yippie-Ki-Yay
la source
La version dynamique peut être un espace réservé pour la dernière version disponible latest.integration,. documentation gradle pour les versions dynamiques
Bhavik

Réponses:

48

Gradle ne prend actuellement pas en charge Maven RELEASE(qui est rarement utilisé et obsolète), mais il prend en charge Ivy's latest.release. Cependant, la recommandation générale est de construire avec des versions exactes. Sinon, la construction peut devenir une loterie.

Peter Niederwieser
la source
Maven ne prend pas en charge RELEASE également. Seuls les numéros de version fixes.
khmarbaise
10
J'ai vérifié deux fois. Maven prend en charge RELEASE, à la fois dans les versions 2 et 3.
Peter Niederwieser
Vous avez raison. Je me suis trompé avec les versions du plugin, car pour Maven 3, il n'autorise plus RELEASE / LATEST. Mais c'est bien sûr une mauvaise pratique d'utiliser de tels identifiants de version.
khmarbaise
Un artefact dans un référentiel Maven Release est celui qui a terminé tous les tests automatisés (et peut-être manuels) possibles. Ce processus devrait inclure des vérifications de compatibilité des API, des tests de régression, etc. Pourquoi alors la construction peut-elle devenir une loterie? Seulement si vous «libérez» des artefacts qui n'ont pas été suffisamment testés.
RCross
2
Grade prend en charge «latest.release» (mais pas «RELEASE»). Ceci est extrêmement utile pour vous assurer que vos propres bibliothèques internes sont à la version la plus récente et éprouvée - je ne recommanderais bien sûr jamais son utilisation pour des bibliothèques externes / tierces pour la même raison que Peter suggère ci-dessus.
RCross
257

Il peut parfois être très utile d'obtenir la dernière version - si par exemple vous publiez souvent vos propres dépendances.

Vous pouvez obtenir la dernière version comme

compile "junit:junit:+"

ou mieux spécifier au moins la version majeure comme

compile "junit:junit:4.+"
jmruc
la source
27
juste pour mémoire: cela devrait en effet être des guillemets! J'ai utilisé des guillemets simples pour la plupart de mes déclarations de dépendance et j'ai découvert que code 'junit:junit:4.+'cela ne fonctionne pas
azonli
1
@azonli semble fonctionner pour moi avec des guillemets simples, au moins pour les dépendances locales. Quelle erreur obtenez-vous?
David Moles
3
ne devrait-il pas être "testCompile" au lieu de "compile"? parce que l'artefact n'est pas nécessaire dans une version
Martin Dürrmeier
6
Vous n'avez pas toujours besoin d'une version reproductible.
Lakatos Gyula
2
@SimonForsberg ... C'est vrai, cependant, lorsque vous êtes en sous-développement, vous voudrez peut-être (a) suivre la pointe de la technologie ou (b) vous assurer que les corrections de bogues pour v 4.+sont maintenues à jour pour votre projet. Lorsque vous atteignez l'étape Alpha, Beta, -RC ou -RELEASE; Je suis tout à fait d'accord que vous devez « clouer » ces versions à un poteau. J'utilise une properties' file to set version specifiers: compilation "junit: junit: $ { junitVer }" `.
sera
25

Découvrez le Gradle-Versions-Plugin. Il fait exactement ce que vous voulez: https://github.com/ben-manes/gradle-versions-plugin

Pour l'installation, consultez la page github. Fondamentalement, vous devez ajouter ces deux lignes à votre fichier build.gradle - projet:

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

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

Ensuite, vous pouvez utiliser le plugin, en exécutant cette commande dans le terminal dans le répertoire de votre projet:

./gradlew dependencyUpdates -Drevision=release

Et il vous montrera quelles dépendances sont obsolètes!

electronix384128
la source
Vous pouvez également l'ajouter à un initscript si vous ne voulez pas avoir à inclure le plugin dans chacun de vos projets. Voir cette réponse à une autre question pour plus de détails.
Laurence Gonsalves
que se passe-t-il si les dépendances sont dans le même dépôt et que vous voulez toujours la dernière version?
Barry Kelly le
8

Le dernier guide de l'utilisateur de Gradle mentionne et explique les versions de connexion plus:

À partir de 7.2. Déclarer vos dépendances :

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

... Le script de construction indique également que tout junit> = 4.0 est requis pour compiler les tests du projet.

À partir du 23.7. Fonctionnement de la résolution des dépendances :

Si la dépendance est déclarée comme une version dynamique (comme 1. +), Gradle résoudra cela avec la dernière version statique disponible (comme 1.2) dans le référentiel. Pour les référentiels Maven, cela se fait à l'aide du fichier maven-metadata.xml, tandis que pour les référentiels Ivy, cela se fait par liste de répertoires.

RunninglVlan
la source
1
Conseil important: le + ne prend pas forcément la dernière version. Voir mon commentaire ci-dessus.
Harry G.
3

Dans Android Studio:

Si vous utilisez +pour la version et que vous voulez savoir quelle version est réellement utilisée , sélectionnez Projectdans la barre latérale, puis sous External Librariesvous verrez le numéro de version réelle en cours d'utilisation.

lenooh
la source
Faites-vous référence à un IDE spécifique? :-)
Inego
Inego: oui, je l'ai ajouté à la réponse ;-)
lenooh