Bağımlılığı bağımlılıkları yeniden indirmeye nasıl zorlayabilirim?


740

Gradle'a bağımlılıkları depolardan yeniden indirmesini nasıl söyleyebilirim?

Yanıtlar:


845

Genellikle, önbellekteki bağımlılıkları komut satırı seçeneği olan --refresh-bağımlılıkları ile yenileyebilirsiniz . Ayrıca önbelleğe alınan dosyaları da silebilirsiniz ~/.gradle/caches. Bir sonraki derleme ile Gradle onları tekrar indirmeyi dener.

Özel kullanım durumunuz nedir? Dinamik bağımlılık sürümleri veya SNAPSHOT sürümleri kullanıyor musunuz?


Unix sistemlerinde, Gradle'ın indirdiği tüm mevcut yapay nesneleri (yapay nesneler ve meta veriler) silebilirsiniz:

rm -rf $HOME/.gradle/caches/

27
OP için konuşamıyorum, ancak benim özel kullanım durumum MavenCentral olmayan bir depo yapılandırmamın gerçekten çalışıp çalışmadığını test etmektir.
Emil Lundberg

7
Ayrıca ~ / .m2 dizinini de kaldırmanız gerekir. Maven repo'yu yapılandırdıysanız, bu eserlerden azı ~ / .m2'ye de indirilir. Temiz kayrakta başlamak için ~ / .gradle ve ~ / .m2 değerlerini kaldırmak daha iyidir.
Gopinath MR

17
Maven Local yalnızca yapınız bir depo olarak tanımladığında geçerlidir.
Benjamin Muschko

21
@Gopinath tehlikeli tavsiye, çünkü .m2 bir maven ayar dosyası içerebilir. Sanırım silmek istiyorum .m2 / depo
Ward

9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
fangzhzh

708

Gradle'ın son bir sürümünü kullanıyorsanız --refresh-dependsencies seçeneğini kullanabilirsiniz.

./gradlew build --refresh-dependencies

Gradle kılavuzuna başvurabilirsiniz .

--Refresh-bağımlılıkları seçeneği Gradle'a çözümlenmiş modüller ve yapay nesneler için tüm önbelleğe alınmış girdileri yok saymasını söyler. Dinamik sürümler yeniden hesaplanmış, modüller yenilenmiş ve eserler indirilmiş olarak, yapılandırılmış tüm depolara karşı yeni bir çözüm gerçekleştirilecektir.


10
Not vermeniz gerekir ki gradle tüm bağımlılık dosyasını indirmeye çalışacağından, zaman alır.
Naga

11
Bunun her zaman işe yaramadığını da belirtmek gerekir. Geçen gece yeni bir sürümü açtığımda, üç günlük önbellekli bir kavanozla "açık berrak savaş - yenileme bağımlılıkları" çalıştırmayı test ettim. Yeni koda eklenen eksik bağımlılık nedeniyle derleme bozuldu. Daha sonra önbellekte üç günlük kavanoz vardı. Sadece .m2 önbelleğimdeki sürüm klasörünü silip yeniden oluşturmaya başladım. Daha sonra en yeni sürümü aldı çünkü temelde başka seçeneği yoktu!
Spanky Quigman

10
daha iyi henüz sadece ./gradlew
yenileme

1
Bu, Android Studio terminalinden './gradlew build --refresh-bağımlılıkları' olarak harika çalıştı. Teşekkürler!
the_dude_abides

2
Android Studio'nun bunu IDE içinden bir yapıda yapmasının bir yolu var mı?
karl

313

Gradle'a, bağımlılığı 'değişen' olarak işaretleyerek derleme komut dosyasındaki bazı bağımlılıkları yeniden indirmesini söyleyebilirsiniz. Gradle daha sonra güncellemeleri 24 saatte bir kontrol eder, ancak bu çözünürlük ResolutionStrategy DSL kullanılarak yapılandırılabilir. Bunu SNAPSHOT veya NIGHTLY yapıları için kullanmayı yararlı buluyorum.

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

Expanded:

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

Yoğun:

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

Bu çözümü bu forum iş parçacığında buldum .


4
Bunun aynı kütüphane kaynakları için nasıl çalıştığını biliyor musunuz? Şu anda, derlenen kitaplık her değiştiğinde indirilir, ancak kaynak değiştirilmez.
Markus Wüstenberg

2
Anlık görüntü sürümü tanım gereği "değişiyor". Gradle, bunu bağımlılık bildiriminizde tanımlamanıza gerek olmadığını bilir.
Benjamin Muschko

4
Bunun için teşekkürler. FWIW, bağımlılığımız bir anlık görüntü versiyonuydu ve bunu yapana kadar her derlemede güncellemeleri kontrol etmiyordu.
sfitts 09

10
cacheChangingModulesForanahtar, changing: trueisteğe bağlıdır, çünkü zımni -SNAPSHOT, burada kısayol kullanmak mümkündür: compile 'group:projectA:1.1-SNAPSHOT'yukarıdaki ima nedeniyle. Bir de bir config resolutionStrategy kısıtlayabilirsiniz: configurations.compile.resolutionS....
TWiStErRob

2
@Umi Bunun kısaltılmış bir sürümü var mı? Gibi compile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows

63

Mac için

./gradlew build --refresh-dependencies

Pencereler için

gradlew build --refresh-dependencies

Ayrıca deneyebilir gradlew assembleDevelopmentDebug --refresh-dependencies


2
Android düzenli bir seviye kullanıyor. Sadece bir eklenti.
Dragas

Gradle sarıcı, Android'e özel değildir. gradle wrapperGörevi kullanarak bir tane oluşturabilirsiniz ; başka bir Gradle sarıcı kullanarak bir sarıcı bile oluşturabilirsiniz:gradlew wrapper
Salvioner

28

Windows için ... sırayla gradle yeniden indirme yapmak için özgü bağımlılıkları yapmak için:

  1. yeniden indirmek istediğiniz bağımlılıkları aşağıdaki dizinden silin:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. yoldaki tüm meta veri dizinlerini sil :

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. Projenin kök dizininde çalıştırın gradle build(veya gradlew buildsınıflayıcı sarmalayıcı kullanıyorsanız).

not: yukarıdaki dosya yollarındaki sayılar sizin için farklı olabilir.


19

Önbellek kavanozları ile klasörü kaldırabilirsiniz.

Benim durumumda, Mac'te kütüphane yolda önbelleğe alındı:

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

Önbelleğe alınmış kütüphane klasörünü kaldırdım (yukarıdaki örnekte "kaldırılacak önbellek-kaldırılacak"), projemin derleme klasörünü sildim ve tekrar derledim. Taze kütüphane indirildi.


16

Burada verilen bazı yanıtların önerdiği gibi, tüm sınıf önbelleğinizi kaldırmak yerine, belirli bir grup veya yapay nesne kimliği için önbelleği silebilirsiniz. Aşağıdaki işlevi ekledim .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
}

Kullanımı:

$ deleteGradleCache com.android.support

Ardından, bir sonraki derlemede veya yeniden senkronize ederseniz, sınıflandırma bağımlılıkları yeniden indirir.


9

Bunu yapmanın 2 yolu vardır:

  1. Bağımlılıkları cashe yenilemek için komut satırı seçeneğini kullanma.
  2. Eski öğelerin Gradle ve tetikleme derlemesi tarafından önbellek olduğu yerel önbelleği silebilirsiniz

--Refresh-bağımlılıklar seçeneğini kullanma :

./gradlew build --refresh-dependencies

Kısa açıklama - yenileme bağımlılıkları seçeneği Gradle'a çözümlenmiş modüller ve yapay nesneler için tüm önbelleğe alınmış girdileri yok saymasını söyler.

Uzun açıklama

  • Yenile bağımlılıkları olan Gradle, güncelleştirilmiş nesneleri kontrol etmek için her zaman uzak sunucuya çarpar: ancak Gradle, aynı dosyanın önbellekte zaten bulunduğu bir dosyayı indirmekten kaçınır.
    • First Gradle bir HEAD isteği yapar ve sunucunun dosyayı son kez değiştirmediğini rapor eder ('content-length' ve 'son değiştirilen' değişmemişse). Bu durumda, "Önbelleğe alınmış kaynak güncel (lastModified: {})" iletisini alırsınız.
    • Sonraki Gradle, mümkünse uzaktan sağlama toplamını (HEAD isteğinden veya bir '.sha1' dosyası indirerek) belirler. Bu sağlama toplamı önceden indirilmiş başka bir dosyayla (herhangi bir depodan) eşleşirse, Gradle dosyayı önbellek, yeniden indirmek yerine. Bu durumda şu iletiyi alırsınız: "“ Eşleşen sağlama toplamıyla yerel olarak kullanılabilir kaynak bulundu: [{}, {}] ”.

Sil özelliğini kullanma: Önbellekleri sildiğinizde

rm -rf $HOME/.gradle/caches/

Tüm önbellek kavanozlarını ve sha1 toplamlarını temizlersiniz ve Gradle, makinenizde herhangi bir eser bulunmadığı ve her şeyi indirmesi gereken bir durumdadır. Evet, ilk kez% 100 çalışacak, ancak başka bir SNAPSHOT serbest bırakıldığında ve bağımlılık ağacınızın bir parçası olduğunda, önbellekleri yenileme veya temizleme seçeneğinin önünde tekrar karşılaşacaksınız.


9

Bu benim için çalıştı. Dosya> Ayarlar> Gradle> Çevrimdışı Çalışma'daki düğmenin işaretini kaldırarak Gradle'ın çevrimdışı olarak ayarlanmadığından emin olun.

Bunu yukarıdaki bağımlılıklara sahip olmak güzel, build.gradle üst düzeyine ekleyin

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

Bağımlılıklarımın şu şekilde yazıldığından emin oldum:

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

Daha sonra, Android Studio'da Gradle panelini açıyorum ve mavi daire okları düğmesini tıklıyorum. Güncellemelerimin her zaman yeni bir kopya aldığını görebiliyorum.


9

Yukarıdaki çözümlerin hiçbiri benim için çalışmadı.

IntelliJ kullanıyorsanız, benim için çözen şey tüm Gradle projelerini yenilemekti:

resim açıklamasını buraya girin


7

Gradle komutlarını nerede çalıştıracağını merak edenler için:

  1. Android Studio'yu aç
  2. Terminal'e tıklayın (Android Studio'nun tabanında bulacaksınız)
  3. Komut aracı açılacak
  4. Komutunuzu yazın gradlew build --refresh-dependencies

6

Android Studio 3.4.1 için

Gradle sekmesini açın (sağda bulunabilir) ve listedeki üst öğeye sağ tıklayın ("Android" olarak adlandırılmalıdır), ardından "Bağımlılıkları yenile" yi seçin.

Bu, sorununuzu çözmelidir.


4

Mb Çok geç kaldım ancak çözümüm tek bir depo için. Bence ~ / .gradle / * silmek aşırıya kaçmış. İçinde bulunduğum problmem, kaynakların olduğu ve sınıfın nexus'tan değil başka bir sürüm aldığı dizini siliyordum. Bundan kaçınmak için bir sonraki çalıştırıyorum:

~/.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

Bundan sonra, dosyalar nexus'tan sürükleniyor.


2

Önbelleğe alınmış 'serbest bırakma' sürümünü yenilemek için tek seçenek yerel önbelleği temizlemektir.

rm -rf $HOME/.gradle/caches/

Önbelleğe alınmış 'anlık görüntü' sürümünü yenilemek için şunları yapabilirsiniz:

./gradlew build --refresh-dependencies

1

Tüm önbellekleri silmek, tüm güvenilirliklerin tekrar indirilmesini sağlar. bu yüzden çok uzun zaman alıyor ve sıkıcı bir şey, tüm bağımlılıkları yeniden indirmek için tekrar bekleyin.

Nasıl bu şekilde aşağıda çözmek mümkün.

Yenilenmesi gereken grupları silin.

Örn: com.user.test grubunu yenilemek istiyorsak

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

sonra bağımlılığı build.gradle dosyasından kaldırın ve yeniden ekleyin. o zaman bağımlılıkları istediğimizi yenileyecek.



0

bu dizini sil:

C:\Users\[username]\.gradle

3
Potansiyel olarak yerel yapılandırmalar olduğu düşünüldüğünde, diğer yanıtlarda belirtildiği gibi önbellek dizinini silmek (veya yeniden adlandırmak / yeniden konumlandırmak) daha iyi bir çözümdür.
dimwittedanimal

0

Çoğu durumda, sadece projeyi yeniden inşa etmek hile yapmalıdır. Bazen ./gradlew build --refresh-dependenciesbirkaç cevabın daha önce bahsettiği gibi koşmanız gerekir (ne kadar bağımlılığınız olduğuna bağlı olarak uzun zaman alır). Her nasılsa, bazen bunların hiçbiri işe yaramaz: bağımlılık güncellenmez. Sonra bunu yapabilirsiniz:

  1. Gradle dosyanızdan bağımlılığı kaldırın
  2. Projenizi çalıştırın / hatalarını ayıklayın ve başarısız olmasını bekleyin ( NonExistingClass olmasını nedeni ile)
  3. "Proje oluştur" a basın ve başarıyla tamamlanmasını bekleyin
  4. Bir kez daha çalıştır / hata ayıkla

Bu çok saçma ve delilik gibi görünüyor, ama aslında bu prosedürü günlük olarak kullanıyorum, çünkü ihtiyacım olan bağımlılık düzinelerce kez güncellenebilir ve yeterli çözümlerin hiçbiri herhangi bir etki yaratmaz.


0

Böyle yapabilirsin

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

Dan alıntı Gradle Yapı Cache devre dışı bırakma

Gradle ile düzenli olarak büyük projeler inşa ederken Gradle derleme önbelleği harika bir şey olabilir. Ancak, sadece zaman zaman açık kaynaklı projeler inşa ederken, hızla büyüyebilir.

Gradle derleme önbelleğini devre dışı bırakmak için şu satırı ekleyin: ~/.gradle/gradle.properties

org.gradle.caching=false

Mevcut önbelleği ile temizleyebilirsiniz.

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/

0

Eclipse kullanıyorsanız ve eclipse'nin bağımlılıkları yeniden yüklemesini istiyorsanız, aşağıdaki komutu deneyebilirsiniz

gradlew clean cleaneclipse build eclipse --refresh-dependencies

2
Neden Eclipse kullanıyorsunuz? Özellikle 2018'de!
Christopher Perry

0

Önbellek klasöründeki belirli bağımlılığın manuel olarak silinmesi işe yarar ... bir iş arkadaşı tarafından kurumsal repoda inşa edilen bir eser.


0

Benim durumumda yukarıdakilerin hiçbiri işe yaramadı, yaptığım şey:

  • İçinde build.gradle , sahip olduğum çözülmemiş ithalata ilişkin bağımlılıkları yorumlarken
  • "Şimdi Senkronize Et" i tıklayın
  • Az önce ne yorum yaptığını uncommenting
  • "Şimdi Senkronize Et" i tekrar tıklamak

Sonra ithalatım düzgün bir şekilde çözüldü.


-7

Yeniden indirmeniz gerekir, böylece bozuk dosyayı manuel olarak indirip değiştirebilir ve projenizi tekrar senkronize edebilirsiniz. Bu konuma gidin C: \ users [kullanıcı adı] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip Burada gradle3.3allzip'i silin ve bu siteden tekrar indirerek değiştirin https: / /services.gradle.org/distributions/ Aynı dosyayı bulun ve indirip bu konuma yapıştırın Sonra projenizi senkronize edin. Umarım senin için de çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.