Gradle - mendapatkan versi rilis terbaru dari sebuah dependensi

93

Apa cara termudah untuk mengetahui Gradlehal-hal berikut:

Ambil ketergantungan 'junit' dan ambil versi 'rilis' terbarunya.

Mengelola repositori Maven dan Ivy adalah hal baru bagi saya. Saya mencoba langkah-langkah berikut dan mereka menghasilkan Could not resolve dependency ...kesalahan:

  • Tulis compile "junit:junit:latest.release"dengan repositori yang disetel ke hanya mavenCentral() (namun, berfungsi jika saya mengatakan "junit: junit: 4.10").

  • Menulis compile "junit:junit:latest.release"dengan repositori diatur dengan cara berikut:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
  • Mencoba menggunakan repositori 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]"
    }

Mungkin saya salah paham. Mengapa mendapatkan versi terbaru dari ketergantungan menjadi tugas yang sulit?

Yippie-Ki-Yay
sumber
Versi dinamis dapat menjadi placeholder untuk versi terbaru yang tersedia , latest.integration. dokumentasi gradle untuk versi dinamis
Bhavik

Jawaban:

49

Gradle saat ini tidak mendukung Maven RELEASE(yang jarang digunakan dan tidak digunakan lagi) tetapi mendukung Ivy latest.release. Namun, rekomendasi umum adalah menggunakan versi yang tepat. Jika tidak, build tersebut bisa menjadi lotre.

Peter Niederwieser
sumber
Maven juga tidak mendukung RELEASE. Hanya nomor versi tetap.
khmarbaise
10
Saya sudah memeriksa ulang. Maven mendukung RELEASE, baik dalam versi 2 dan 3.
Peter Niederwieser
Kamu benar. Saya salah mengira bahwa dengan versi plugin, karena Maven 3 tidak mengizinkan RELEASE / LATEST lagi. Tapi tentu saja praktik yang buruk untuk menggunakan pengenal versi seperti itu.
khmarbaise
Artefak dalam repositori Rilis Maven adalah salah satu yang telah menyelesaikan semua kemungkinan pengujian otomatis (dan mungkin manual). Proses itu harus mencakup pemeriksaan kompatibilitas API, pengujian regresi, dan sebagainya. Lalu mengapa build bisa menjadi lotre? Hanya jika Anda "melepaskan" artefak yang belum cukup diuji.
RCross
2
Grade mendukung 'latest.release' (tetapi bukan 'RELEASE'). Ini sangat berguna untuk memastikan bahwa perpustakaan internal Anda memiliki versi terbaru dan terbukti - saya tentu saja tidak akan pernah menganjurkan penggunaannya untuk perpustakaan eksternal / pihak ketiga karena alasan yang sama seperti yang disarankan Peter di atas.
RCross
257

Terkadang mendapatkan rilis terbaru dapat sangat berguna - misalnya jika Anda sering merilis dependensi Anda sendiri.

Anda bisa mendapatkan versi terbaru seperti

compile "junit:junit:+"

atau lebih baik tentukan setidaknya versi utama seperti

compile "junit:junit:4.+"
jmruc
sumber
28
hanya sebagai catatan: itu memang harus menjadi tanda kutip ganda! Saya telah menggunakan tanda kutip tunggal untuk sebagian besar deklarasi ketergantungan saya dan ternyata code 'junit:junit:4.+'tidak berhasil
azonli
1
@azonli Sepertinya bekerja untuk saya dengan tanda kutip tunggal, setidaknya untuk dependensi lokal. Kesalahan apa yang Anda dapatkan?
David Moles
3
bukankah seharusnya "testCompile" bukan "compile"? karena artefak tidak diperlukan dalam rilis
Martin Dürrmeier
6
Anda tidak selalu membutuhkan build yang dapat direproduksi.
Lakatos Gyula
2
@SimonForsberg ... Benar, namun ketika Anda berada di bawah-pengembangan Anda mungkin ingin (a) mengikuti berdarah-tepi atau (b) memastikan bug-perbaikan untuk v 4.+yang terus up to date untuk proyek Anda. Saat Anda mencapai tahap Alfa, Beta, -RC atau -RELEASE; Saya sangat setuju Anda perlu ' memaku ' versi itu ke tiang. Saya menggunakan properties' file to set version specifiers: kompilasi "junit: junit: $ { junitVer }" `.
Akan
25

Lihat Plugin-Versi-Gradle. Itu persis seperti yang Anda inginkan: https://github.com/ben-manes/gradle-versions-plugin

Untuk instalasi, lihat halaman github. Pada dasarnya Anda perlu menambahkan dua baris ini ke file build.gradle - proyek Anda:

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

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

Kemudian Anda dapat menggunakan plugin, dengan menjalankan perintah ini di terminal di direktori proyek Anda:

./gradlew dependencyUpdates -Drevision=release

Dan itu akan menunjukkan kepada Anda dependensi mana yang sudah ketinggalan zaman!

electronix384128
sumber
Anda juga dapat menambahkan ini ke skrip init jika Anda tidak ingin menyertakan plugin di setiap proyek Anda. Lihat jawaban untuk pertanyaan lain ini untuk detailnya.
Laurence Gonsalves
bagaimana jika dependensi berada dalam repo yang sama, dan Anda selalu menginginkan versi terbaru?
Barry Kelly
8

Panduan Pengguna Gradle terbaru menyebutkan dan menjelaskan versi masuk plus:

Dari 7.2. Mendeklarasikan dependensi Anda :

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

... Skrip build juga menyatakan bahwa setiap junit> = 4.0 diperlukan untuk mengompilasi pengujian proyek.

Dari 23.7. Bagaimana resolusi ketergantungan bekerja :

Jika dependensi dideklarasikan sebagai versi dinamis (seperti 1. +), Gradle akan menyelesaikannya ke versi statis terbaru yang tersedia (seperti 1.2) di repositori. Untuk repositori Maven, ini dilakukan dengan menggunakan file maven-metadata.xml, sedangkan untuk repositori Ivy ini dilakukan dengan daftar direktori.

RunninglVlan
sumber
1
Petunjuk penting: + tidak selalu mengambil versi terbaru. Lihat komentar saya di atas.
Harry G.
3

Di Android Studio:

Jika Anda menggunakan +untuk versi tersebut, dan ingin tahu versi mana yang sebenarnya sedang digunakan , pilih Projectdi bilah sisi, lalu di bawah External LibrariesAnda akan melihat nomor versi yang sebenarnya sedang digunakan.

lenooh
sumber
Apakah Anda mengacu pada IDE tertentu? :-)
Inego
Inego: ya, saya menambahkannya ke jawaban ;-)
lenooh