Gradle - Abrufen der neuesten Release-Version einer Abhängigkeit

93

Was wäre der einfachste Weg, um GradleFolgendes zu sagen :

Rufen Sie die 'junit'-Abhängigkeit ab und nehmen Sie die neueste' Release'-Version.

Das Verwalten von Maven- und Ivy-Repositories ist für mich etwas Neues. Ich habe die folgenden Schritte ausprobiert und sie führen zu Could not resolve dependency ...Fehlern:

  • Schreiben Sie compile "junit:junit:latest.release"mit Repositorys, die nur auf eingestellt sind mavenCentral() (es funktioniert jedoch, wenn ich "junit: junit: 4.10" sage).

  • Schreiben Sie compile "junit:junit:latest.release"mit Repository-Set wie folgt:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
    
  • Es wurde versucht, das Spring Source Ivy-Repository zu verwenden:

    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]"
    }
    

Vielleicht verstehe ich etwas falsch. Warum sollte es so schwierig sein , die neueste Version der Abhängigkeit zu erhalten?

Yippie-Ki-Yay
quelle
Die dynamische Version kann ein Platzhalter für die neueste verfügbare Version sein latest.integration. Gradle-Dokumentation für dynamische Versionen
Bhavik

Antworten:

48

Gradle unterstützt derzeit nicht Maven's RELEASE(was selten verwendet und veraltet ist), aber Ivy's latest.release. Die allgemeine Empfehlung lautet jedoch, gegen exakte Versionen zu bauen. Andernfalls kann der Build zu einer Lotterie werden.

Peter Niederwieser
quelle
Maven unterstützt RELEASE ebenfalls nicht. Nur feste Versionsnummern.
Khmarbaise
10
Ich habe es noch einmal überprüft. Maven unterstützt RELEASEsowohl in Version 2 als auch in Version 3.
Peter Niederwieser
Du hast recht. Ich habe mich geirrt, dass mit den Plugin-Versionen, weil für Maven 3 RELEASE / LATEST nicht mehr erlaubt ist. Aber es ist natürlich eine schlechte Praxis, solche Versionskennungen zu verwenden.
Khmarbaise
Ein Artefakt in einem Maven Release-Repository hat alle möglichen automatisierten (und möglicherweise manuellen) Tests abgeschlossen. Dieser Prozess sollte API-Kompatibilitätsprüfungen, Regressionstests usw. umfassen. Warum kann der Bau dann zu einer Lotterie werden? Nur wenn Sie Artefakte "freigeben", die nicht ausreichend getestet wurden.
RCross
2
Grade unterstützt 'latest.release' (aber nicht 'RELEASE'). Dies ist äußerst nützlich, um sicherzustellen, dass Ihre eigenen internen Bibliotheken die neueste, bewährte Version haben. Ich würde natürlich niemals die Verwendung für externe Bibliotheken / Bibliotheken von Drittanbietern aus demselben Grund befürworten, den Peter oben vorgeschlagen hat.
RCross
257

Manchmal kann es sehr nützlich sein, die neueste Version zu erhalten - wenn Sie beispielsweise häufig Ihre eigenen Abhängigkeiten veröffentlichen.

Sie können die neueste Version wie erhalten

compile "junit:junit:+"

oder besser zumindest die Hauptversion wie angeben

compile "junit:junit:4.+"
jmruc
quelle
27
Nur zur Veranschaulichung: Das sollten in der Tat doppelte Anführungszeichen sein! Ich habe für die meisten meiner Abhängigkeitserklärungen einfache Anführungszeichen verwendet und festgestellt, dass code 'junit:junit:4.+'dies nicht funktioniert
Azonli
1
@azonli Scheint für mich mit einfachen Anführungszeichen zu funktionieren, zumindest für lokale Abhängigkeiten. Welchen Fehler bekommen Sie?
David Moles
3
sollte es nicht "testCompile" statt "compile" sein? weil Artefakt in einer Veröffentlichung nicht benötigt wird
Martin Dürrmeier
6
Sie benötigen nicht immer einen reproduzierbaren Build.
Lakatos Gyula
2
@SimonForsberg ... stimmt, aber wenn Sie Unterentwicklung sind , können Sie wollen (a) die folgen bleeding-edge oder (b) Bug-Fixes für v sicherzustellen , 4.+sind bisher für das Projekt gehalten. Wenn Sie das Alpha, Beta, -RC oder -RELEASE Stadium erreichen; Ich stimme vollkommen zu, dass Sie diese Versionen an eine Stange nageln müssen . Ich benutze eine properties' file to set version specifiers: Kompilierung "junit: junit: $ { junitVer }" `.
wird
25

Schauen Sie sich das Gradle-Versions-Plugin an. Es macht genau das, was Sie wollen: https://github.com/ben-manes/gradle-versions-plugin

Informationen zur Installation finden Sie auf der Github-Seite. Grundsätzlich müssen Sie diese beiden Zeilen zu Ihrer build.gradle - Projektdatei hinzufügen:

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

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

Dann können Sie das Plugin verwenden, indem Sie diesen Befehl im Terminal in Ihrem Projektverzeichnis ausführen:

./gradlew dependencyUpdates -Drevision=release

Und es zeigt Ihnen, welche Abhängigkeiten veraltet sind!

Electronix384128
quelle
Sie können dies auch zu einem Initscript hinzufügen, wenn Sie das Plugin nicht in jedes Ihrer Projekte aufnehmen möchten. Siehe diese Antwort auf eine andere Frage für Details.
Laurence Gonsalves
Was ist, wenn sich die Abhängigkeiten im selben Repo befinden und Sie immer die neueste Version möchten?
Barry Kelly
8

Das neueste Gradle-Benutzerhandbuch erwähnt und erklärt sowie Anmeldeversionen:

Ab 7.2. Deklarieren Sie Ihre Abhängigkeiten :

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

... Das Build-Skript gibt außerdem an, dass zum Kompilieren der Projekttests ein Junit> = 4.0 erforderlich ist.

Ab 23.7. So funktioniert die Abhängigkeitsauflösung :

Wenn die Abhängigkeit als dynamische Version (wie 1. +) deklariert ist, löst Gradle diese in die neueste verfügbare statische Version (wie 1.2) im Repository auf. Bei Maven-Repositorys erfolgt dies mithilfe der Datei maven-metadata.xml, bei Ivy-Repositorys erfolgt dies durch Verzeichnisliste.

RunninglVlan
quelle
1
Wichtiger Hinweis: Das + benötigt nicht unbedingt die neueste Version. Siehe meinen Kommentar oben.
Harry G.
3

In Android Studio:

Wenn Sie +für die Version verwenden und wissen möchten, welche Version tatsächlich verwendet wird , wählen Sie Projectin der Seitenleiste aus, und unter External Librarieswird die tatsächlich verwendete Versionsnummer angezeigt.

lenooh
quelle
Beziehen Sie sich auf eine bestimmte IDE? :-)
Inego
Inego: Ja, ich habe es der Antwort hinzugefügt
;-)