Gradle: ottenere l'ultima versione di rilascio di una dipendenza


93

Quale sarebbe il modo più semplice per dire Gradlequanto segue:

Recupera la dipendenza "junit" e prendi la sua ultima versione "release".

Gestire i repository Maven e Ivy è una cosa nuova per me. Ho provato i seguenti passaggi e risultano in Could not resolve dependency ...errore:

  • Scrivi compile "junit:junit:latest.release"con i repository impostati solo su mavenCentral() (tuttavia, funziona se dico "junit: junit: 4.10").

  • Scrivi compile "junit:junit:latest.release"con il repository impostato nel modo seguente:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
  • Tentativo di utilizzare il repository 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]"
    }

Forse fraintendo qualcosa. Perché ottenere l' ultima versione della dipendenza sarebbe un compito così difficile?


Versione dinamica può essere un segnaposto per l'ultima versione disponibile, latest.integration. documentazione gradle per versioni dinamiche
Bhavik

Risposte:


48

Gradle attualmente non supporta Maven's RELEASE(che è usato raramente e deprecato) ma supporta Ivy's latest.release. Tuttavia, la raccomandazione generale è quella di costruire in base alle versioni esatte. Altrimenti, la build può diventare una lotteria.


Anche Maven non supporta RELEASE. Solo numeri di versione fissi.
khmarbaise

10
Ho ricontrollato. Maven supporta RELEASE, sia nella versione 2 che 3.
Peter Niederwieser

Hai ragione. Ho sbagliato con le versioni del plugin, perché per Maven 3 non consente più RELEASE / LATEST. Ma è ovviamente una cattiva pratica usare tali identificatori di versione.
khmarbaise

Un artefatto in un repository di Maven Release è quello che ha completato tutti i possibili test automatizzati (e forse manuali). Tale processo dovrebbe includere controlli di compatibilità API, test di regressione e così via. Perché allora la build può diventare una lotteria? Solo se stai "rilasciando" artefatti che non sono stati sufficientemente testati.
RCross

2
Grade supporta "latest.release" (ma non "RELEASE"). Ciò è estremamente utile per garantire che le tue librerie interne siano alla versione più recente e collaudata - ovviamente non ne raccomanderei mai l'uso per librerie esterne / di terze parti per lo stesso motivo suggerito da Peter sopra.
RCross

257

A volte può essere molto utile ottenere l'ultima versione, ad esempio se rilasci spesso le tue dipendenze.

Puoi ottenere l'ultima versione come

compile "junit:junit:+"

o meglio specificare almeno la versione principale come

compile "junit:junit:4.+"

27
solo per la cronaca: dovrebbero essere davvero le virgolette! Ho usato virgolette singole per la maggior parte delle mie dichiarazioni di dipendenza e ho scoperto che code 'junit:junit:4.+'non funziona
azonli

1
@azonli Sembra funzionare per me con virgolette singole, almeno per le dipendenze locali. Che errore ricevi?
David Moles

3
non dovrebbe essere "testCompile" invece di "compile"? perché l'artefatto non è necessario in una versione
Martin Dürrmeier

6
Non hai sempre bisogno di una build riproducibile.
Lakatos Gyula,

2
@SimonForsberg ... Vero, tuttavia quando sei in fase di sviluppo potresti voler (a) seguire l' avanguardia o (b) assicurarti che le correzioni di bug per v 4.+siano tenute aggiornate per il tuo progetto. Quando raggiungi la fase Alpha, Beta, -RC o -RELEASE; Sono assolutamente d'accordo che devi " inchiodare " quelle versioni a un palo. Uso una properties' file to set version specifiers: compilazione "junit: junit: $ { junitVer }" ".
sarà

25

Dai un'occhiata al plug-in Gradle-Versions. Fa esattamente quello che vuoi: https://github.com/ben-manes/gradle-versions-plugin

Per l'installazione, vedere la pagina github. Fondamentalmente è necessario aggiungere queste due righe al file build.gradle - progetto:

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

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

Quindi puoi usare il plugin, eseguendo questo comando nel terminale nella directory del tuo progetto:

./gradlew dependencyUpdates -Drevision=release

E ti mostrerà quali dipendenze sono obsolete!


Puoi anche aggiungerlo a un initscript se non vuoi includere il plugin in ognuno dei tuoi progetti. Vedi questa risposta a un'altra domanda per i dettagli.
Laurence Gonsalves

cosa succede se le dipendenze sono nello stesso repository e si desidera sempre l'ultima versione?
Barry Kelly,

8

L'ultima guida per l'utente Gradle menziona e spiega le versioni con accesso più:

Dal 7.2. Dichiarare le tue dipendenze :

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

... Lo script di compilazione afferma anche che qualsiasi junit> = 4.0 è necessario per compilare i test del progetto.

Dal 23.7. Come funziona la risoluzione delle dipendenze :

Se la dipendenza è dichiarata come una versione dinamica (come 1. +), Gradle risolverà il problema nella versione statica più recente disponibile (come 1.2) nel repository. Per i repository Maven, questo viene fatto utilizzando il file maven-metadata.xml, mentre per i repository Ivy questo viene fatto dall'elenco delle directory.


1
Suggerimento importante: il + non accetta necessariamente l'ultima versione. Vedi il mio commento sopra.
Harry G.

3

In Android Studio:

Se stai utilizzando +per la versione e desideri sapere quale versione è effettivamente utilizzata , seleziona Projectnella barra laterale, quindi sotto External Librariesvedrai il numero di versione effettivo in uso.


Ti riferisci a un IDE specifico? :-)
Inego

Inego: sì, l'ho aggiunto alla risposta ;-)
lenooh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.