ฉันจะบังคับให้ gradle ทำการ redownload dependencies ได้อย่างไร


740

ฉันจะบอกให้ gradle ทำการดาวน์โหลดการพึ่งพาจากคลังเก็บซ้ำได้อย่างไร

คำตอบ:


845

โดยทั่วไปแล้วคุณสามารถฟื้นฟูการอ้างอิงในแคชของคุณมีตัวเลือกบรรทัดคำสั่ง--refresh-อ้างอิง ~/.gradle/cachesนอกจากนี้คุณยังสามารถลบไฟล์ที่เก็บไว้ภายใต้ ด้วยการสร้าง Gradle ครั้งต่อไปจะพยายามดาวน์โหลดอีกครั้ง

กรณีการใช้งานเฉพาะของคุณคืออะไร? คุณใช้เวอร์ชันการพึ่งพาแบบไดนามิกหรือเวอร์ชัน SNAPSHOT หรือไม่


บนระบบ Unix คุณสามารถลบส่วนที่มีอยู่ทั้งหมด (ส่วนและข้อมูลเมตา) Gradle ได้ดาวน์โหลดโดยใช้:

rm -rf $HOME/.gradle/caches/

27
ฉันพูดไม่ได้สำหรับ OP แต่กรณีการใช้งานเฉพาะของฉันคือการทดสอบว่าการกำหนดค่าของที่เก็บที่ไม่ใช่ MavenCentral ใช้งานได้จริงหรือไม่
Emil Lundberg

7
คุณต้องลบไดเรกทอรี ~ / .m2 (ถ้ามี) หากคุณได้กำหนดค่า maven repo ของสิ่งประดิษฐ์เหล่านั้นจะถูกดาวน์โหลดเป็น ~ / .m2 ด้วย ดีกว่าที่จะลบทั้ง ~ / .gradle และ ~ / .m2 เพื่อเริ่มต้นบนกระดานชนวนที่สะอาด
Gopinath MR

17
Maven Local เกี่ยวข้องเฉพาะถ้าบิลด์ของคุณกำหนดว่าเป็นที่เก็บ
Benjamin Muschko

21
@Gopinath ที่เป็นคำแนะนำที่เป็นอันตรายเนื่องจาก. m2 สามารถมีไฟล์การตั้งค่า maven ฉันเดาว่าคุณหมายถึงลบ. m2 / พื้นที่เก็บข้อมูล
วอร์ด

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

708

หากคุณใช้ Gradle รุ่นล่าสุดคุณสามารถใช้ตัวเลือก --refresh-dependencies

./gradlew build --refresh-dependencies

คุณสามารถดูที่คู่มือ Gradle

ตัวเลือก --refresh-dependencies บอกให้ Gradle ละเว้นรายการแคชทั้งหมดสำหรับโมดูลและส่วนที่ได้รับการแก้ไข การแก้ไขใหม่จะดำเนินการกับที่เก็บข้อมูลที่กำหนดค่าไว้ทั้งหมดพร้อมการคำนวณรุ่นแบบไดนามิกการรีเฟรชโมดูลและการดาวน์โหลดสิ่งประดิษฐ์


10
คุณต้องสังเกตว่าตั้งแต่ gradle จะพยายามดาวน์โหลดไฟล์อ้างอิงทั้งหมดมันใช้เวลานาน
นาค

11
นอกจากนี้ยังเป็นที่น่าสังเกตว่าสิ่งนี้อาจไม่ได้ผลเสมอไป ฉันเพิ่งทดสอบการใช้งาน "สงครามที่ชัดเจนมาก - การรีเฟรชการอ้างอิง" ด้วยโถที่เก็บไว้ซึ่งมีอายุสามวันเมื่อฉันปรับใช้เวอร์ชันใหม่เมื่อคืนนี้ บิลด์แตกเนื่องจากการอ้างอิงที่หายไปที่เพิ่มในรหัสใหม่ ฉันยังมีโถสามวันในแคชหลังจากนั้น ในที่สุดฉันก็แค่ลบโฟลเดอร์เวอร์ชันในแคช. m2 และสร้างใหม่ มันได้เวอร์ชั่นใหม่ล่าสุดเพราะโดยทั่วไปไม่มีทางเลือก!
Spanky Quigman

10
ยังดีกว่าเพียงแค่. /gradlew --refresh-dependencies
headsvk

1
สิ่งนี้ใช้งานได้ดีเช่น './gradlew build --refresh-dependencies' จากเทอร์มินัล Android Studio ขอบคุณ!
the_dude_abides

2
มีวิธีให้ Android Studio ทำสิ่งนี้กับ build จากภายใน IDE หรือไม่?
karl

313

คุณสามารถบอก Gradle ให้ดาวน์โหลดการอ้างอิงบางอย่างในสคริปต์การสร้างอีกครั้งโดยตั้งค่าสถานะการพึ่งพาว่า 'เปลี่ยนแปลง' Gradle จะตรวจสอบการอัปเดตทุก ๆ 24 ชั่วโมง แต่สิ่งนี้สามารถกำหนดค่าได้โดยใช้ resolutionStrategy DSL ฉันพบว่ามีประโยชน์ในการใช้สิ่งนี้สำหรับการสร้าง SNAPSHOT หรือ NIGHTLY

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

ขยาย:

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

ย่อ:

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

ฉันพบโซลูชันนี้ที่กระทู้ในฟอรัมนี้


4
คุณรู้หรือไม่ว่าวิธีนี้ใช้กับแหล่งที่มาของไลบรารีเดียวกันได้หรือไม่ ปัจจุบันไลบรารีที่คอมไพล์ถูกดาวน์โหลดทุกครั้งที่มีการเปลี่ยนแปลง แต่แหล่งที่มาไม่ได้
Markus Wüstenberg

2
เวอร์ชันสแน็ปช็อตคือ "การเปลี่ยนแปลง" ตามคำจำกัดความ Gradle รู้ดีว่าคุณไม่จำเป็นต้องกำหนดสิ่งนี้ในการประกาศการพึ่งพาของคุณ
Benjamin Muschko

4
ขอบคุณสำหรับสิ่งนี้. FWIW การพึ่งพาของเราอยู่ในสแน็ปช็อตเวอร์ชันและจนกว่าเราจะทำสิ่งนี้มันไม่ได้ตรวจสอบการอัปเดตในทุกบิลด์
sfitts

10
cacheChangingModulesForเป็นกุญแจchanging: trueเป็นทางเลือกเพราะมันบอกเป็นนัยโดย-SNAPSHOTเป็นไปได้ที่จะใช้ชวเลขที่นี่: compile 'group:projectA:1.1-SNAPSHOT'เนื่องจากความหมายข้างต้น หนึ่งยังสามารถ จำกัด การ resolutionStrategy configurations.compile.resolutionS...ให้เป็นหนึ่งในการกำหนดค่า:
TWiStErRob

2
@Umi มีรุ่นย่อนี้หรือไม่ เช่นcompile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows

63

สำหรับ MAC

./gradlew build --refresh-dependencies

สำหรับ Windows

gradlew build --refresh-dependencies

สามารถลองได้ gradlew assembleDevelopmentDebug --refresh-dependencies


2
Android ใช้การไล่ระดับสีปกติ มันเป็นแค่ปลั๊กอิน
Dragas

เสื้อคลุม Gradle ไม่ได้เป็นเอกสิทธิ์ของ Android คุณสามารถสร้างหนึ่งโดยใช้gradle wrapperงาน คุณสามารถสร้าง wrapper โดยใช้ wrapper Gradle อีกอันหนึ่งได้gradlew wrapper
Salvioner

28

สำหรับ Windows ... เพื่อให้ gradle ดาวน์โหลดการอ้างอิงเฉพาะอีกครั้ง:

  1. ลบการอ้างอิงที่คุณต้องการดาวน์โหลดอีกครั้งจากไดเรกทอรีด้านล่าง:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. ลบไดเรกทอรีข้อมูลเมตาทั้งหมดที่เส้นทาง:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. run gradle build(หรือgradlew buildถ้าใช้ gradle wrapper) ในไดเรกทอรีรากของโครงการ

หมายเหตุ: ตัวเลขในพา ธ ของไฟล์ด้านบนอาจแตกต่างกันสำหรับคุณ


19

หนึ่งสามารถลบโฟลเดอร์ที่มีขวดแคช

ในกรณีของฉันบน Macไลบรารีถูกแคชที่พา ธ :

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

ฉันลบโฟลเดอร์ไลบรารีแคช ("ตัวอย่างแคชไลบรารีเพื่อลบ" ในตัวอย่างด้านบน) ลบโฟลเดอร์บิลด์ของโครงการของฉันและคอมไพล์อีกครั้ง ห้องสมุดสดถูกดาวน์โหลดแล้ว


16

แทนการลบแคช gradle ทั้งหมดของคุณเช่นเดียวกับคำตอบบางอย่างที่แนะนำคุณสามารถลบแคชสำหรับกลุ่มหรือรหัสสิ่งประดิษฐ์ที่เฉพาะเจาะจงได้ ฉันได้เพิ่มฟังก์ชั่นต่อไปนี้ในของฉัน.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
}

การใช้งาน:

$ deleteGradleCache com.android.support

จากนั้นในบิลด์ถัดไปหรือหากคุณซิงค์อีกครั้ง Gradle จะดาวน์โหลดการอ้างอิงอีกครั้ง


9

มี 2 ​​วิธีในการทำเช่นนั้น:

  1. การใช้ตัวเลือกบรรทัดคำสั่งเพื่อรีเฟรชเงินสดขึ้นอยู่กับ
  2. คุณสามารถลบแคชโลคัลที่ซึ่ง artefasts แคชโดย Gradle และทริกเกอร์บิลด์

ใช้-ตัวเลือกการอ้างอิงสดชื่น :

./gradlew build --refresh-dependencies

คำอธิบายสั้น ๆ - ตัวเลือกการอ้างอิงแบบรีเฟรชบอกให้ Gradle ละเว้นรายการแคชทั้งหมดสำหรับโมดูลและส่วนที่ได้รับการแก้ไข

คำอธิบายยาว ๆ

  • ด้วย Gradle พึ่งพาการรีเฟรช 'จะกดเซิร์ฟเวอร์ระยะไกลเสมอเพื่อตรวจสอบสิ่งประดิษฐ์ที่อัปเดต: อย่างไรก็ตาม Gradle จะหลีกเลี่ยงการดาวน์โหลดไฟล์ที่ไฟล์เดียวกันมีอยู่แล้วในแคช
    • First Gradle จะทำการร้องขอ HEAD และตรวจสอบว่าเซิร์ฟเวอร์รายงานไฟล์ว่าไม่เปลี่ยนแปลงตั้งแต่ครั้งที่แล้ว (ถ้า 'ความยาวเนื้อหา' และ 'แก้ไขครั้งสุดท้าย' ไม่เปลี่ยนแปลง) ในกรณีนี้คุณจะได้รับข้อความ: "ทรัพยากรที่เก็บไว้เป็นปัจจุบัน (ล่าสุดแก้ไข: {})"
    • Gradle ถัดไปจะกำหนดการตรวจสอบระยะไกลหากเป็นไปได้ (จากคำขอ HEAD หรือโดยการดาวน์โหลดไฟล์ '.sha1') .. หากการตรวจสอบนี้ตรงกับไฟล์อื่นที่ดาวน์โหลดไปแล้ว (จากที่เก็บใด ๆ ) จากนั้น Gradle จะคัดลอกไฟล์ใน แคชแทนที่จะดาวน์โหลดซ้ำ ในกรณีนี้คุณจะได้รับข้อความ: "" พบทรัพยากรที่มีอยู่ในเครื่องพร้อมกับ checksum ที่ตรงกัน: [{}, {}] "

ใช้ลบ: เมื่อคุณลบแคช

rm -rf $HOME/.gradle/caches/

คุณเพียงแค่ทำความสะอาดขวดที่เก็บไว้ทั้งหมดและผลรวม sha1 และ Gradle อยู่ในสถานการณ์ที่ไม่มีสิ่งประดิษฐ์ในเครื่องของคุณและต้องดาวน์โหลดทุกอย่าง ใช่มันจะใช้งานได้ 100% เป็นครั้งแรก แต่เมื่อมีการปล่อย SNAPSHOT อื่นและเป็นส่วนหนึ่งของแผนภูมิการพึ่งพาของคุณคุณจะต้องเผชิญหน้าอีกครั้งต่อหน้าตัวเลือกเพื่อรีเฟรชหรือล้างแคช


9

สิ่งนี้ใช้ได้สำหรับฉัน ตรวจสอบให้แน่ใจว่า Gradle ไม่ได้ถูกตั้งเป็นออฟไลน์โดยปุ่มยกเลิกการเลือกที่ไฟล์> การตั้งค่า> Gradle> ออฟไลน์ที่ทำงาน

เพิ่มสิ่งนี้ลงในระดับบนสุดของ build.gradle ของคุณซึ่งดีต่อการพึ่งพา

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

ฉันทำให้แน่ใจว่าการอ้างอิงของฉันถูกเขียนเช่นนี้

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

หลังจากนั้นฉันเปิดแผง Gradle ใน Android Studio และคลิกปุ่มลูกศรวงกลมสีน้ำเงิน ฉันสามารถเห็นการอัปเดตของฉันเพื่อรับสำเนาใหม่เสมอ


9

วิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน

หากคุณใช้ IntelliJ สิ่งที่แก้ไขได้สำหรับฉันคือการรีเฟรชโครงการ Gradle ทั้งหมด:

ป้อนคำอธิบายรูปภาพที่นี่


7

สำหรับผู้ที่สงสัยว่าจะใช้คำสั่ง gradle ได้ที่ไหน:

  1. เปิด Android Studio
  2. คลิกที่เทอร์มินัล (คุณจะพบมันในฐานของ Android Studio)
  3. เครื่องมือคำสั่งจะเปิดขึ้น
  4. พิมพ์คำสั่งของคุณ gradlew build --refresh-dependencies

6

สำหรับ Android Studio 3.4.1

เพียงเปิดแท็บการไล่ระดับสี (สามารถอยู่ทางด้านขวา) และคลิกขวาบนพาเรนต์ในรายการ (ควรเรียกว่า "Android") จากนั้นเลือก "รีเฟรชการอ้างอิง"

การดำเนินการนี้ควรแก้ไขปัญหาของคุณ


4

Mb ฉันสายเกินไป แต่โซลูชันของฉันใช้สำหรับที่เก็บเดียว ฉันคิดว่าการลบ ~ / .gradle / * มากเกินไป problmem ที่ฉันชนคือว่าฉันลบไดเรกทอรีที่แหล่งที่มาและ gradle ได้รับรุ่นอื่นไม่ได้จาก Nexus เพื่อหลีกเลี่ยงการที่ฉันเรียกใช้ต่อไป:

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

หลังจาก gradle นั้นกำลังลากไฟล์จาก nexus


2

หากต้องการรีเฟรชเวอร์ชัน 'ปล่อย' แคชตัวเลือกเดียวคือการล้างแคชในตัวเครื่อง

rm -rf $HOME/.gradle/caches/

หากต้องการรีเฟรชเวอร์ชัน 'ภาพรวม' ที่แคชไว้คุณสามารถ:

./gradlew build --refresh-dependencies

1

การลบแคชทั้งหมดทำให้ดาวน์โหลดการอ้างอิงทั้งหมดอีกครั้ง ดังนั้นจึงใช้เวลานานมากและเป็นเรื่องน่าเบื่อรออีกครั้งเพื่อดาวน์โหลดการพึ่งพาทั้งหมด

ฉันจะสามารถแก้ไขวิธีด้านล่างนี้ได้อย่างไร

เพียงลบกลุ่มที่ต้องรีเฟรช

เช่นถ้าเราต้องการรีเฟรชกลุ่มcom.user.test

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

จากนั้นลบการพึ่งพาจาก build.gradle และเพิ่มใหม่ จากนั้นมันจะรีเฟรชการพึ่งพาสิ่งที่เราต้องการ



0

ลบไดเรกทอรีนี้:

C:\Users\[username]\.gradle

3
ระบุว่าอาจมีการกำหนดค่าท้องถิ่นการลบ (หรือเปลี่ยนชื่อ / ย้ายตำแหน่ง) ไดเรกทอรีแคชดังกล่าวในคำตอบอื่น ๆ เป็นทางออกที่ดีกว่า
สลัว

0

สำหรับกรณีส่วนใหญ่เพียงแค่สร้างโครงการขึ้นมาใหม่ควรทำสิ่งที่หลอกลวง บางครั้งคุณต้องเรียกใช้./gradlew build --refresh-dependenciesตามคำตอบหลายข้อที่ได้กล่าวไปแล้ว (ใช้เวลานานขึ้นอยู่กับจำนวนการพึ่งพาของคุณ) เท่าที่เคยมีมาบางครั้งก็ไม่มีใครทำงาน: การพึ่งพาก็จะไม่ได้รับการปรับปรุง จากนั้นคุณสามารถทำสิ่งนี้:

  1. ลบการอ้างอิงจากไฟล์ gradle ของคุณ
  2. เรียกใช้ / แก้ไขข้อบกพร่องของโครงการและรอให้โครงการล้มเหลว (ด้วยNonExistingClassเหตุผล)
  3. กดปุ่ม "สร้างโครงการ" และรอจนเสร็จสมบูรณ์
  4. เรียกใช้ / ดีบักอีกครั้ง

มันไร้สาระและดูเหมือนว่าบ้า แต่จริง ๆ แล้วฉันใช้ขั้นตอนนี้ทุกวันเพียงเพราะการพึ่งพาที่ฉันต้องการสามารถอัปเดตหลายสิบครั้งและไม่มีวิธีแก้ปัญหาที่เพียงพอจะมีผลใด ๆ


0

คุณสามารถทำได้เช่นนี้

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

อ้างจากการปิดการใช้งาน Gradle Build Cache

การสร้างแคชของ Gradle อาจเป็นสิ่งที่ดีเมื่อคุณสร้างโครงการขนาดใหญ่ที่มี Gradle เป็นประจำ อย่างไรก็ตามเมื่อสร้างโครงการโอเพนซอร์ซเป็นครั้งคราวเท่านั้น

หากต้องการปิดใช้งานแคชการสร้าง Gradle ให้เพิ่มบรรทัดต่อไปนี้ ~/.gradle/gradle.properties

org.gradle.caching=false

คุณสามารถล้างแคชที่มีอยู่ด้วย

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

0

หากคุณกำลังใช้ eclipse และหากคุณต้องการบังคับให้ eclipse โหลดการขึ้นต่อกันอีกครั้งคุณสามารถลองคำสั่งด้านล่าง

gradlew clean cleaneclipse build eclipse --refresh-dependencies

2
ทำไมคุณถึงใช้ Eclipse โดยเฉพาะอย่างยิ่งในปี 2018!
Christopher Perry

0

เฉพาะการลบการอ้างอิงเฉพาะในโฟลเดอร์แคชด้วยตนเองเท่านั้นที่ใช้งานได้ ... สิ่งประดิษฐ์ที่สร้างขึ้นโดยเพื่อนร่วมงานใน repo ขององค์กร


0

ในกรณีของฉันไม่มีการทำงานใด ๆ ข้างต้นสิ่งที่ฉันทำคือ

  • ในการbuild.gradleแสดงความคิดเห็นการอ้างอิงที่เกี่ยวข้องกับการนำเข้าที่ยังไม่ได้แก้ไขที่ฉันมี
  • คลิกที่ "ซิงค์ทันที"
  • ไม่มีข้อคิดเห็นในสิ่งที่ฉันเพิ่งแสดงความคิดเห็น
  • คลิก "ซิงค์ทันที" อีกครั้ง

จากนั้นการนำเข้าของฉันได้รับการแก้ไขอย่างเหมาะสมอีกครั้ง


-7

คุณต้องดาวน์โหลดใหม่เพื่อให้คุณสามารถดาวน์โหลดและแทนที่ไฟล์ที่เสียหายด้วยตนเองและทำการซิงค์โครงการของคุณอีกครั้ง ไปที่ตำแหน่งนี้ C: \ users [ชื่อผู้ใช้] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip ที่นี่ลบ gradle3.3allzip และแทนที่ด้วยการดาวน์โหลดอีกครั้งจากเว็บไซต์นี้ https: / /services.gradle.org/distribution/ ค้นหาไฟล์เดียวกันและดาวน์โหลดและวางลงในตำแหน่งนั้นจากนั้นซิงค์โครงการของคุณ หวังว่ามันจะเหมาะกับคุณเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.