Bagaimana saya bisa memaksa gradle untuk mengunduh ulang dependensi?

742

Bagaimana saya dapat memberitahu gradle untuk mengunduh kembali dependensi dari repositori?

fedor.belov
sumber

Jawaban:

845

Secara umum, Anda dapat menyegarkan dependensi di cache dengan opsi baris perintah --reesh-dependensi . Anda juga dapat menghapus file yang di-cache di bawah ~/.gradle/caches. Dengan build selanjutnya, Gradle akan mencoba mengunduhnya lagi.

Apa kasus penggunaan khusus Anda? Apakah Anda menggunakan versi ketergantungan dinamis atau versi SNAPSHOT?


Pada sistem Unix, Anda dapat menghapus semua artefak (artefak dan metadata) yang ada yang diunduh Gradle menggunakan:

rm -rf $HOME/.gradle/caches/
Benjamin Muschko
sumber
27
Saya tidak dapat berbicara untuk OP, tetapi kasus penggunaan khusus saya adalah untuk menguji apakah konfigurasi repositori non-MavenCentral benar-benar berfungsi.
Emil Lundberg
7
Anda juga perlu menghapus direktori ~ / .m2 (jika ada). Jika Anda telah mengkonfigurasi maven repo, beberapa artefak tersebut juga dapat diunduh ke ~ / .m2. Lebih baik untuk menghapus ~ / .gradle dan ~ / .m2 untuk mulai membersihkan.
Gopinath MR
17
Maven Local hanya relevan jika build Anda mendefinisikannya sebagai repositori.
Benjamin Muschko
21
@ Gopinath itu saran berbahaya, karena .m2 dapat berisi file pengaturan pakar. Saya kira maksud Anda menghapus .m2 / repositori
Ward
9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
fangzhzh
708

Jika Anda menggunakan versi terbaru Gradle, Anda dapat menggunakan opsi --refresh-dependencies.

./gradlew build --refresh-dependencies

Anda dapat merujuk ke manual Gradle .

Opsi --refresh-dependencies memberi tahu Gradle untuk mengabaikan semua entri yang di-cache untuk modul dan artefak yang diselesaikan. Resolusi baru akan dilakukan terhadap semua repositori yang dikonfigurasi, dengan versi dinamis dihitung ulang, modul di-refresh, dan artefak diunduh.

Naga
sumber
10
Anda harus perhatikan bahwa karena gradle akan mencoba mengunduh semua file dependensi, itu membutuhkan waktu lama.
Naga
11
Perlu juga dicatat bahwa ini tidak selalu berhasil. Saya baru saja diuji menjalankan "perang jelas gradle - refresh-dependensi" dengan toples cache yang berusia tiga hari, ketika saya telah menggunakan versi baru larut malam lalu. Build rusak karena ketergantungan yang hilang yang ditambahkan dalam kode baru. Saya masih menyimpan toples tiga hari di cache setelahnya. Saya akhirnya hanya menghapus folder versi di cache .m2 saya dan membangun kembali. Kemudian mendapat versi terbaru karena pada dasarnya tidak punya pilihan!
Spiggy Quigman
10
lebih baik lagi ./gradlew --refresh-dependencies
headsvk
1
Ini bekerja sangat baik sebagai './gradlew build --refresh-dependencies' dari terminal Android Studio. Terima kasih!
the_dude_abides
2
Apakah ada cara untuk membuat Android Studio melakukan ini dengan membangun dari dalam IDE?
karl
314

Anda dapat memberi tahu Gradle untuk mengunduh kembali beberapa dependensi dalam skrip build dengan menandai dependensi sebagai 'berubah'. Gradle kemudian akan memeriksa pembaruan setiap 24 jam, tetapi ini dapat dikonfigurasikan menggunakan resolusinya. Saya merasa berguna untuk menggunakan ini untuk SNAPSHOT atau membangun MALAM.

configurations.all {
    // Check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Diperluas:

dependencies {
    implementation group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}

Kental:

implementation('group:projectA:1.1-SNAPSHOT') { changing = true }

Saya menemukan solusi ini di utas forum ini .

Umi
sumber
4
Apakah Anda mengetahui cara kerjanya untuk sumber untuk perpustakaan yang sama? Saat ini, pustaka yang dikompilasi diunduh setiap kali ia berubah, tetapi sumbernya tidak.
Markus Wüstenberg
2
Versi snapshot "berubah" menurut definisi. Gradle tahu itu sehingga Anda sebenarnya tidak perlu mendefinisikan ini dalam deklarasi dependensi Anda.
Benjamin Muschko
4
Terima kasih untuk ini. FWIW, ketergantungan kami ada pada versi snapshot dan sampai kami melakukan ini, ia tidak memeriksa pembaruan di setiap build.
sfitts
10
cacheChangingModulesForadalah kuncinya, changing: truebersifat opsional karena tersirat oleh -SNAPSHOT, mungkin untuk menggunakan singkatan di sini: compile 'group:projectA:1.1-SNAPSHOT'karena implikasi di atas. Satu juga dapat membatasi resolutionStrategy satu config: configurations.compile.resolutionS....
TWiStErRob
2
@ Umi Apakah ada versi ringkas dari ini? Seperti compile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows
63

Untuk Mac

./gradlew build --refresh-dependencies

Untuk Windows

gradlew build --refresh-dependencies

Bisa juga mencoba gradlew assembleDevelopmentDebug --refresh-dependencies

Ali
sumber
2
Android menggunakan gradle reguler. Itu hanya sebuah plugin.
Dragas
Pembungkus Gradle bukan eksklusif Android. Anda dapat menghasilkan satu menggunakan gradle wrappertugas; Anda bahkan dapat membuat pembungkus menggunakan pembungkus Gradle lain:gradlew wrapper
Penyelamat
28

Untuk Windows ... untuk membuat unduhan dependensi khusus gradle :

  1. hapus dependensi yang ingin Anda unduh kembali dari direktori di bawah ini:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. hapus semua direktori metadata di jalur:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. jalankan gradle build(atau gradlew buildjika menggunakan gradle wrapper) di direktori root proyek.

Catatan: angka-angka di jalur file di atas mungkin berbeda untuk Anda.

Eric
sumber
19

Satu dapat menghapus folder dengan stoples cache.

Dalam kasus saya, pada Mac perpustakaan di-cache di path:

/Users/MY_NAME/.gradle/caches/modules-2/files-2.1/cached-library-to-remove

Saya menghapus folder cached library ("cached-library-to-remove" pada contoh di atas), menghapus folder build dari proyek saya dan mengkompilasi lagi. Perpustakaan baru telah diunduh.

Farhan
sumber
16

Alih-alih menghapus seluruh cache gradle, seperti disarankan beberapa jawaban di sini, Anda dapat menghapus cache untuk grup atau id artefak tertentu. Saya menambahkan fungsi berikut ke .bash_profile:

deleteGradleCache() {
  local id=$1
  if [ -z "$id" ]; then
    echo "Please provide an group or artifact id to delete"
    return 1
  fi
  find ~/.gradle/caches/ -type d -name "$id" -prune -exec rm -rf "{}" \; -print
}

Pemakaian:

$ deleteGradleCache com.android.support

Kemudian, pada build berikutnya atau jika Anda melakukan sinkronisasi ulang, gradle akan mengunduh ulang dependensi.

Jared Rummler
sumber
9

Ada 2 cara untuk melakukan itu:

  1. Menggunakan opsi baris perintah untuk menyegarkan dependen cashe.
  2. Anda dapat menghapus cache lokal di mana artefasts di-cache oleh Gradle dan memicu build

Menggunakan opsi --refresh-dependencies :

./gradlew build --refresh-dependencies

Penjelasan singkat --refresh-dependensi memberi tahu Gradle untuk mengabaikan semua entri yang di-cache untuk modul dan artefak yang diselesaikan.

Penjelasan panjang

  • Dengan Gradle-dependensi dependensi 'akan selalu menekan server jarak jauh untuk memeriksa artefak yang diperbarui: namun, Gradle akan menghindari mengunduh file di mana file yang sama sudah ada dalam cache.
    • Gradle Pertama akan membuat permintaan HEAD dan memeriksa apakah server melaporkan file sebagai tidak berubah sejak terakhir kali (jika 'konten-panjang' dan 'terakhir-diubah' tidak berubah). Dalam hal ini Anda akan mendapatkan pesan: "Sumber daya yang di-cache adalah yang terbaru (lastModified: {})."
    • Gradle Selanjutnya akan menentukan checksum jarak jauh jika memungkinkan (baik dari permintaan HEAD atau dengan mengunduh file '.sha1'). Jika checksum ini cocok dengan file lain yang sudah diunduh (dari repositori mana pun), maka Gradle hanya akan menyalin file di dalam cache, daripada mengunduh ulang. Dalam hal ini Anda akan mendapatkan pesan: "" Ditemukan sumber daya yang tersedia secara lokal dengan checksum yang cocok: [{}, {}] ".

Menggunakan delete: Saat Anda menghapus cache

rm -rf $HOME/.gradle/caches/

Anda cukup membersihkan semua stoples dan jumlah cache yang di-cache dan Gradle berada dalam situasi di mana tidak ada artefak pada mesin Anda dan harus mengunduh semuanya. Ya itu akan bekerja 100% untuk pertama kalinya, tetapi ketika SNAPSHOT lain dilepaskan dan itu adalah bagian dari pohon dependensi Anda, Anda akan dihadapkan lagi di depan pilihan untuk menyegarkan atau membersihkan cache.

Xelian
sumber
9

Ini berhasil untuk saya. Pastikan Gradle tidak diatur ke offline dengan menghapus centang pada File> Pengaturan> Gradle> Offline Work.

Tambahkan ini ke tingkat atas build.gradle Anda, senang memiliki dependensi di atas

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Saya memastikan dependensi saya ditulis seperti ini:

implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
    changing = true
}

Setelah itu, saya membuka panel Gradle di Android Studio dan klik tombol panah lingkaran biru. Saya selalu dapat melihat pembaruan saya mendapatkan salinan baru.

Juan Mendez
sumber
9

Tidak ada solusi di atas yang berfungsi untuk saya.

Jika Anda menggunakan IntelliJ, apa yang terselesaikan bagi saya hanyalah menyegarkan semua proyek Gradle:

masukkan deskripsi gambar di sini

Kobbi Gal
sumber
7

Bagi mereka yang bertanya-tanya di mana harus menjalankan perintah gradle:

  1. Buka Android Studio
  2. Klik Terminal (Anda akan menemukannya di dasar Android Studio)
  3. Alat perintah akan terbuka
  4. Ketikkan perintah Anda gradlew build --refresh-dependencies
kgandroid
sumber
6

Untuk Android Studio 3.4.1

Cukup buka tab gradle (dapat ditemukan di kanan) dan klik kanan pada induk dalam daftar (harus disebut "Android"), lalu pilih "Refresh dependencies".

Ini harus menyelesaikan masalah Anda.

Carl Du Plessis
sumber
4

Mb Saya terlambat tetapi solusi saya adalah untuk repositori tunggal. Saya pikir menghapus ~ / .gradle / * berlebihan. Masalah yang saya temui adalah saya menghapus direktori tempat source dan gradle mendapatkan versi lain bukan dari nexus. Untuk menghindari itu saya menjalankan yang berikutnya:

~/.gradle$ find . -type d -name 'group.plugins.awssdk'
./caches/modules-2/files-2.1/group.plugins.awssdk
./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

~/.gradle$ rm -r ./caches/modules-2/files-2.1/group.plugins.awssdk   ./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

Setelah itu gradle menyeret file dari nexus.

Vadim
sumber
2

Untuk menyegarkan versi 'rilis' yang di-cache, satu-satunya pilihan adalah menghapus cache lokal.

rm -rf $HOME/.gradle/caches/

Untuk menyegarkan versi 'snapshot' dalam cache Anda dapat:

./gradlew build --refresh-dependencies
Karol Król
sumber
1

Menghapus semua cache membuat unduhan semua ketergantungan lagi. jadi butuh waktu sangat lama dan itu hal yang membosankan tunggu lagi untuk mengunduh ulang semua ketergantungan.

Bagaimana saya bisa menyelesaikan ini di bawah ini.

Hapus saja grup yang perlu di-refresh.

Mis: jika kita ingin me-refresh grup com.user.test

rm -fr ~/.gradle/caches/modules-2/files-2.1/com.user.test/

kemudian hapus dependensi dari build.gradle dan tambahkan kembali. maka itu akan menyegarkan dependensi apa yang kita inginkan.

Chamly Idunil
sumber
0

hapus direktori ini:

C:\Users\[username]\.gradle
farhang67
sumber
3
Mengingat bahwa ada kemungkinan konfigurasi lokal, menghapus, (atau mengganti nama / memindahkan) direktori cache seperti disebutkan dalam jawaban lain adalah solusi yang lebih baik.
dimwittedanimal
0

Untuk sebagian besar kasus, hanya dengan membangun kembali proyek harus melakukan trik. Kadang-kadang Anda harus menjalankan ./gradlew build --refresh-dependencieskarena beberapa jawaban telah disebutkan (butuh waktu lama, tergantung pada seberapa banyak dependensi yang Anda miliki). Bagaimana pun, kadang-kadang tidak satupun dari mereka akan bekerja: ketergantungan tidak akan diperbarui. Kemudian, Anda dapat melakukan ini:

  1. Hapus ketergantungan dari file gradle Anda
  2. Jalankan / debug proyek Anda dan tunggu sampai gagal (dengan NonExistingClass alasan)
  3. Tekan "build project" dan tunggu sampai selesai dengan sukses
  4. Jalankan / debug sekali lagi

Ini konyol dan sepertinya gila, tetapi saya benar-benar menggunakan prosedur ini setiap hari, hanya karena ketergantungan yang saya butuhkan dapat diperbarui puluhan kali dan tidak ada solusi yang memadai yang akan berpengaruh.

egorikem
sumber
0

Anda bisa melakukannya seperti ini

https://marschall.github.io/2017/04/17/disabling-gradle-cache.html

Mengutip dari Menonaktifkan Cache Gradle Build

Tembolok bangunan Gradle mungkin menjadi hal yang hebat ketika Anda secara teratur membangun proyek-proyek besar dengan Gradle. Namun ketika hanya sesekali membangun proyek open source, ia dapat dengan cepat menjadi besar.

Untuk menonaktifkan cache build Gradle tambahkan baris berikut ke ~/.gradle/gradle.properties

org.gradle.caching=false

Anda dapat membersihkan cache yang ada dengan

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/
wuqilong
sumber
0

Jika Anda menggunakan eclipse dan jika Anda ingin memaksa eclipse untuk memuat kembali dependensi Anda dapat mencoba perintah di bawah ini

gradlew clean cleaneclipse build eclipse --refresh-dependencies
ULLAS K
sumber
2
Mengapa Anda menggunakan Eclipse? Terutama di 2018!
Christopher Perry
0

Hanya penghapusan manual dari ketergantungan khusus dalam folder cache yang berfungsi ... sebuah artifactory yang dibuat oleh seorang rekan dalam repo perusahaan.

WesternGun
sumber
0

Dalam kasus saya tidak ada yang berhasil, yang saya lakukan adalah:

  • Di build.gradle, mengomentari dependensi terkait dengan impor yang belum terselesaikan yang saya miliki
  • Mengklik "Sinkronkan Sekarang"
  • Membatalkan komentar apa yang baru saja saya komentari
  • Mengklik "Sinkronkan Sekarang" lagi

Kemudian impor saya diselesaikan dengan benar lagi.

Louis
sumber
-7

Anda perlu mengunduh ulang, sehingga Anda dapat mengunduh dan mengganti file yang rusak secara manual dan menyinkronkan lagi proyek Anda. Pergi ke lokasi ini C: \ users [username] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip Di sini hapus gradle3.3allzip dan ganti dengan mengunduh lagi dari situs ini https: / /services.gradle.org/distributions/ Temukan file yang sama dan unduh dan tempel ke lokasi itu Kemudian sinkronkan proyek Anda. Semoga berhasil juga untuk Anda.

Rahul Gupta
sumber