मैं निर्भरता को कम करने के लिए कैसे मजबूर कर सकता हूं?


740

मैं रिपॉजिटरी से निर्भरता को कम करने के लिए कैसे वर्गीकृत कर सकता हूं?

जवाबों:


845

आम तौर पर, आप कमांड लाइन विकल्प --refresh- निर्भरता के साथ अपने कैश में निर्भरता को ताज़ा कर सकते हैं । आप के तहत कैश्ड फ़ाइलों को भी हटा सकते हैं ~/.gradle/caches। अगले बिल्ड के साथ ग्रेडल उन्हें फिर से डाउनलोड करने का प्रयास करेगा।

आपका विशिष्ट उपयोग मामला क्या है? क्या आप डायनेमिक निर्भरता संस्करणों या स्नैपशॉट संस्करणों का उपयोग करते हैं?


यूनिक्स प्रणालियों पर, आप सभी मौजूदा कलाकृतियों (कलाकृतियों और मेटाडेटा) को हटा सकते हैं। ग्रेडल ने इसका उपयोग किया है:

rm -rf $HOME/.gradle/caches/

27
मैं ओपी के लिए बात नहीं कर सकता, लेकिन मेरा विशिष्ट उपयोग मामला यह परीक्षण करने के लिए है कि क्या मेरे गैर-मावेनसेन्ट्रल भंडार का विन्यास वास्तव में काम करता है।
एमिल लंडबर्ग

7
आपको ~ / .m2 निर्देशिका (यदि मौजूद है) को निकालने की आवश्यकता है। यदि आपने मावेन रेपो को कॉन्फ़िगर किया है तो उनमें से कुछ कलाकृतियाँ ~ / .m2 पर भी डाउनलोड हो जाती हैं। स्वच्छ स्लेट पर शुरू करने के लिए ~ / .gradle और ~ / .m2 दोनों को निकालना बेहतर है।
गोपीनाथ MR

17
मावेन लोकल केवल तभी प्रासंगिक है जब आपका बिल्ड इसे रिपॉजिटरी के रूप में परिभाषित करता है।
बेंजामिन मुस्कोको

21
@ गोपीनाथ जो खतरनाक सलाह है, .m2 में एक मावेन सेटिंग फाइल हो सकती है। मुझे लगता है कि आप डिलीट मतलब .m2 / रिपॉजिटरी
वार्ड

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

708

यदि आप ग्रैडल के हालिया संस्करण का उपयोग कर रहे हैं, तो आप --refresh- निर्भरता विकल्प का उपयोग कर सकते हैं।

./gradlew build --refresh-dependencies

आप ग्रेड मैनुअल का उल्लेख कर सकते हैं ।

--Refresh- निर्भरता विकल्प ग्रैडल को हल मॉड्यूल और कलाकृतियों के लिए सभी कैश्ड प्रविष्टियों को अनदेखा करने के लिए कहता है। एक नया रिज़ॉल्यूशन सभी कॉन्फ़िगर किए गए रिपॉजिटरी के खिलाफ किया जाएगा, जिसमें डायनामिक वर्जन पुनर्गणित, मॉड्यूल्स रिफ्रेश और डाउनलोड की गई कलाकृतियां होंगी।


10
आपको यह ध्यान रखना होगा कि चूंकि ग्रेडेल सभी निर्भरता फ़ाइल को डाउनलोड करने का प्रयास करेगी, इसलिए इसमें लंबा समय लगता है।
नागा

11
यह भी ध्यान देने योग्य है कि यह हमेशा काम नहीं करता है। मैंने एक कैश्ड जार के साथ "ग्रेडल क्लियर वॉर - क्रेफ़ेश-डिपेंडेंसीज़" का परीक्षण किया, जो तीन दिन पुराना था, जब मैंने कल देर रात एक नया संस्करण तैनात किया था। नए कोड में जोड़े गए अनुपलब्ध निर्भरता के कारण बिल्ड टूट गया। मेरे पास अभी भी कैश में तीन दिन पुराना जार था। मैंने अपने .m2 कैश और पुनर्निर्माण में संस्करण फ़ोल्डर को हटा दिया। इसे तब सबसे नया संस्करण मिला क्योंकि इसमें मूल रूप से कोई विकल्प नहीं था!
स्पेंकी क्विगमैन

10
अभी तक सिर्फ बेहतर ।/gradlew --refresh- निर्भरता
हेडवेक

1
इसने एंड्रॉइड स्टूडियो टर्मिनल से './gradlew build --refresh-dependencies' के रूप में शानदार काम किया। धन्यवाद!
the_dude_abides

2
क्या आईडीई के अंदर से एक निर्माण पर ऐसा करने के लिए एंड्रॉइड स्टूडियो प्राप्त करने का एक तरीका है?
कार्ल

313

आप ग्रेडल को निर्भरता को 'बदलते' के रूप में चिह्नित करके बिल्ड स्क्रिप्ट में कुछ निर्भरता को फिर से डाउनलोड करने के लिए कह सकते हैं। ग्रैडल हर 24 घंटे में अपडेट की जाँच करेगा, लेकिन इसे रेजोल्यूशनस्ट्रीट्टी डीएसएल का उपयोग करके कॉन्फ़िगर किया जा सकता है। मैं इसे स्नैपशॉट या नाइटली बिल्ड के लिए उपयोग करना उपयोगी समझता हूं।

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
क्या आपको पता है कि यह उसी लाइब्रेरी के स्रोतों के लिए कैसे काम करता है? वर्तमान में, संकलित लाइब्रेरी को हर बार बदलने के बाद डाउनलोड किया जाता है, लेकिन स्रोत नहीं है।
मार्कस वुस्टनबर्ग

2
एक स्नैपशॉट संस्करण परिभाषा से "बदल रहा है"। ग्रैडल को पता है कि इसलिए आपको वास्तव में अपनी निर्भरता घोषणा में इसे परिभाषित करने की आवश्यकता नहीं है।
बेंजामिन मस्कको

4
इसके लिए धन्यवाद। FWIW, हमारी निर्भरता एक स्नैपशॉट संस्करण पर थी और जब तक हमने ऐसा नहीं किया तब तक यह हर बिल्ड पर अपडेट के लिए जाँच नहीं कर रहा था।
sfitts

10
cacheChangingModulesForकुंजी है, changing: trueवैकल्पिक है क्योंकि इसके द्वारा निहित है -SNAPSHOT, यहां आशुलिपि का उपयोग करना संभव है: compile 'group:projectA:1.1-SNAPSHOT'उपरोक्त निहितार्थ के कारण। एक भी संकल्प को एक विन्यास में प्रतिबंधित कर सकता है configurations.compile.resolutionS...:।
TWStStrrob

2
@ यूमी क्या इसका कोई संक्षिप्त संस्करण है? जैसे कि compile 'com.burrowsapps:ads:1.0:true'?
जारेड बुर्ज

63

मैक के लिए

./gradlew build --refresh-dependencies

विंडोज के लिए

gradlew build --refresh-dependencies

भी आजमा सकते हैं gradlew assembleDevelopmentDebug --refresh-dependencies


2
Android नियमित रूप से वर्गीकृत करता है। यह सिर्फ एक प्लगइन है।
ड्रैगस

ग्रैडल रैपर एक Android अनन्य नहीं है। आप एक का उपयोग कर gradle wrapperकार्य उत्पन्न कर सकते हैं ; तुम भी एक और gradlew wrapper
ग्रेडर

28

Windows के लिए ... क्रमिक पुन: डाउनलोड करने के लिए विशिष्ट निर्भरताएँ बनाने के लिए:

  1. नीचे दी गई निर्देशिका से पुन: डाउनलोड करने के लिए निर्भरताएँ हटाएँ:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. रास्ते में सभी मेटाडेटा निर्देशिकाओं को हटाएं :

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. प्रोजेक्ट के रूट डायरेक्टरी में रन gradle build(या gradlew buildअगर ग्रेडर रैपर का उपयोग करते हैं)।

नोट: उपरोक्त फ़ाइल पथों की संख्याएँ आपके लिए भिन्न हो सकती हैं।


19

एक कैश्ड जार के साथ फ़ोल्डर को हटा सकता है।

मेरे मामले में, मैक पर पुस्तकालय को रास्ते में कैश किया गया था:

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

मैंने कैश्ड लाइब्रेरी फ़ोल्डर ("कैश्ड-लाइब्रेरी-टू-रिमूव" को उपरोक्त उदाहरण में हटा दिया), अपने प्रोजेक्ट के बिल्ड फ़ोल्डर को हटा दिया और फिर से संकलित किया। ताजा पुस्तकालय तब डाउनलोड किया गया था।


16

अपना संपूर्ण ग्रेड कैश निकालने के बजाय, जैसे कि यहां कुछ उत्तर सुझा रहे हैं, आप किसी विशिष्ट समूह या विरूपण साक्ष्य आईडी के लिए कैश हटा सकते हैं। मैंने निम्नलिखित फंक्शन को अपने साथ जोड़ा .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

फिर, अगले बिल्ड पर या यदि आप फिर से सिंक करते हैं, तो निर्भरता फिर से डाउनलोड हो जाएगी।


9

ऐसा करने के 2 तरीके हैं:

  1. आश्रितों को काश ताज़ा करने के लिए कमांड लाइन विकल्प का उपयोग करना।
  2. आप स्थानीय कैश को हटा सकते हैं जहां ग्रेड और ट्रिगर बिल्ड द्वारा कलाकृतियाँ कैश हैं

--Refresh- निर्भरता विकल्प का उपयोग करना :

./gradlew build --refresh-dependencies

संक्षिप्त विवरण - क्रेफ़ेश-डिपेंडेंसी विकल्प ग्रैडल को हल किए गए मॉड्यूल और कलाकृतियों के लिए सभी कैश्ड प्रविष्टियों को अनदेखा करने के लिए कहता है।

लंबी व्याख्या

  • वायरथ्रेफेश-डिपेंडेंसीज 'ग्रेडेल हमेशा अपडेट की गई कलाकृतियों की जांच करने के लिए रिमोट सर्वर को हिट करेगा: हालांकि, ग्रैड एक फाइल डाउनलोड करने से बचेंगे जहां कैश में वही फाइल पहले से मौजूद है।
    • फर्स्ट ग्रैड एक HEAD अनुरोध करेगा और जाँच करेगा कि क्या सर्वर पिछली बार से फ़ाइल को अपरिवर्तित करता है (यदि 'सामग्री-लंबाई' और 'अंतिम-संशोधित' अपरिवर्तित हैं)। इस मामले में आपको संदेश प्राप्त होगा: "कैश्ड संसाधन अद्यतित है (अंतिम रूप से संशोधित: {})।"
    • अगला ग्रैडल संभव हो तो दूरस्थ चेकसम को निर्धारित करेगा (या तो HEAD अनुरोध से या '.sha1' फ़ाइल डाउनलोड करके) .. यदि यह चेकसम पहले से डाउनलोड की गई (किसी रिपॉजिटरी से) किसी अन्य फ़ाइल से मेल खाता है, तो ग्रैडल बस फ़ाइल को कॉपी कर लेगा कैश, फिर से डाउनलोड करने के बजाय। इस मामले में आपको संदेश मिलेगा: "" मिलान वाले चेकसम के साथ स्थानीय रूप से उपलब्ध संसाधन: [{}, {}]।

Delete का उपयोग करना: जब आप caches को हटाते हैं

rm -rf $HOME/.gradle/caches/

आप बस सभी कैश्ड जार और sha1 sums को साफ करते हैं और ग्रेडल ऐसी स्थिति में है जहां आपकी मशीन पर कोई कलाकृतियां नहीं हैं और सब कुछ डाउनलोड करना है। हां यह पहली बार 100% काम करेगा, लेकिन जब एक और स्नैपशॉट जारी किया जाता है और यह आपकी निर्भरता के पेड़ का हिस्सा होता है तो आपको फिर से ताज़ा करने या कैश को शुद्ध करने के विकल्प के सामने पेश किया जाएगा।


9

इसने मेरे लिए काम किया। सुनिश्चित करें कि फ़ाइल> सेटिंग्स> ग्रेडल> ऑफ़लाइन कार्य पर बटन को अनचेक करके ऑफ़लाइन ग्रेड सेट नहीं किया गया है।

अपने build.gradle के शीर्ष स्तर पर इसे जोड़ें, निर्भरता के ऊपर अच्छा है

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

मैंने सुनिश्चित किया कि मेरी निर्भरताएं इस तरह लिखी गई हैं:

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

इसके बाद, मैं एंड्रॉइड स्टूडियो में ग्रेड पैनल खोलता हूं और नीले सर्कल के तीर बटन पर क्लिक करता हूं। मैं हमेशा अपने अपडेट को एक नई ताज़ा प्रतिलिपि प्राप्त करते हुए देख सकता हूँ।


9

ऊपर दिए गए किसी भी समाधान ने मेरे लिए काम नहीं किया।

यदि आप IntelliJ का उपयोग करते हैं, तो मेरे लिए जो हल किया गया था, वह सभी ग्रेडल परियोजनाओं को ताज़ा कर रहा था:

यहां छवि विवरण दर्ज करें


7

उन लोगों के लिए, जो सोच रहे हैं कि ग्रेडल कमांड को कहां चलाया जाए:

  1. Android Studio खोलें
  2. टर्मिनल पर क्लिक करें (आपको यह एंड्रॉइड स्टूडियो के बेस में मिलेगा)
  3. कमांड टूल खुलेगा
  4. अपना कमांड टाइप करें gradlew build --refresh-dependencies

6

एंड्रॉइड स्टूडियो के लिए 3.4.1

बस ग्रेड टैब खोलें (दाईं ओर स्थित हो सकता है) और सूची में माता-पिता पर राइट-क्लिक करें (इसे "एंड्रॉइड" कहा जाना चाहिए), फिर "रिफ्रेश निर्भरता" चुनें।

इससे आपकी समस्या का समाधान होना चाहिए।


4

एमबी मैं बहुत देर हो चुकी हूं लेकिन मेरा समाधान एकल रिपॉजिटरी के लिए है। मुझे लगता है कि डिलीट करना ~ / .gradle / * ओवरकिल है। मैं जिस संभावना से टकरा रहा था, वह यह था कि मैं निर्देशिका को हटा रहा था जहां स्रोत थे और ग्रेडेल को नेक्सस से नहीं एक और संस्करण मिल रहा था। इससे बचने के लिए कि मैं अगला भाग:

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

उसके बाद ग्रेडल नेक्सस से फाइलों को खींच रहा है।


2

कैश्ड 'रिलीज़' संस्करण को रीफ्रेश करने के लिए स्थानीय कैश को साफ़ करना एकमात्र विकल्प है।

rm -rf $HOME/.gradle/caches/

कैश्ड 'स्नैपशॉट' संस्करण को ताज़ा करने के लिए:

./gradlew build --refresh-dependencies

1

सभी कैश को हटाने से सभी आश्रितों को फिर से डाउनलोड करना पड़ता है। इसलिए इसमें इतना समय लगता है और सभी आश्रितों को फिर से डाउनलोड करने के लिए यह फिर से उबाऊ बात है।

कैसे मैं कभी भी इस तरह से हल करने में सक्षम हो सकता है।

बस उन समूहों को हटा दें जिन्हें ताज़ा करने की आवश्यकता है।

Ex: यदि हम com.user.test ग्रुप को रिफ्रेश करना चाहते हैं

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

फिर build.gradle से निर्भरता को हटा दें और इसे पुनः जोड़ें। तो यह निर्भरता को ताज़ा करेगा कि हम क्या चाहते हैं।


0

मुझे लगता है कि २.१४.१ की समस्या को हल करता है। स्वीकृत उत्तर सही है, लेकिन -फ्रेश-निर्भरता के साथ श्रेणी में एक बग है। 2.14.1 इसे ठीक करता है।

Https://discuss.gradle.org/t/refresh-d dependencies-should-use-cachechangingmodulesfor-0s/556 देखें


0

इस निर्देशिका को हटा दें:

C:\Users\[username]\.gradle

3
यह देखते हुए कि संभावित स्थानीय कॉन्फ़िगरेशन हैं, हटाने, (या नाम बदलने / स्थानांतरित) के रूप में अन्य उत्तर में वर्णित कैश निर्देशिका एक बेहतर समाधान है।
dimwittedanimal

0

अधिकांश मामलों के लिए, बस परियोजना को फिर से निर्माण करना चाहिए। कभी-कभी आपको दौड़ना पड़ता है ./gradlew build --refresh-dependenciesक्योंकि कई उत्तर पहले ही उल्लेख कर चुके हैं (आपके पास कितनी निर्भरता है, इसके आधार पर एक लंबा समय लगता है)। कैसे, कभी-कभी, उनमें से कोई भी काम नहीं करेगा: निर्भरता सिर्फ अपडेट नहीं होगी। फिर, आप यह कर सकते हैं:

  1. अपनी श्रेणी फ़ाइल से निर्भरता निकालें
  2. अपना प्रोजेक्ट चलाएं / डिबग करें और इसके असफल NonExistingClassहोने का इंतजार करें ( कारण के साथ )
  3. हिट "बिल्ड प्रोजेक्ट" और इसके सफलतापूर्वक समाप्त होने की प्रतीक्षा करें
  4. रन / डिबग एक बार फिर

यह हास्यास्पद है और पागलपन जैसा लगता है, लेकिन मैं वास्तव में इस प्रक्रिया का उपयोग दैनिक रूप से करता हूं, सिर्फ इसलिए कि मुझे जिस निर्भरता की आवश्यकता है उसे दर्जनों बार अपडेट किया जा सकता है और पर्याप्त समाधानों में से किसी का भी कोई प्रभाव नहीं होगा।


0

आप इसे इस तरह से कर सकते हैं

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

ग्रेड बिल्ड कैश को अक्षम करने से उद्धृत करने के लिए

जब आप नियमित रूप से निर्माण कर रहे हों तो ग्रेडल के साथ ग्रैड बिल्ड कैश एक बेहतरीन चीज हो सकती है। हालाँकि जब कभी-कभार ओपन सोर्स> प्रोजेक्ट्स का निर्माण होता है तो यह जल्दी बड़ा हो सकता है।

ग्रेडल बिल्ड कैश को अक्षम करने के लिए निम्न लाइन को जोड़ें ~/.gradle/gradle.properties

org.gradle.caching=false

आप मौजूदा कैश को इससे साफ़ कर सकते हैं

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

0

यदि आप ग्रहण का उपयोग कर रहे हैं और यदि आप चाहते हैं कि आप ग्रहण निर्भरता को फिर से लागू करने के लिए बल प्रयोग कर सकते हैं, तो आप नीचे दिए गए आदेश को आजमा सकते हैं

gradlew clean cleaneclipse build eclipse --refresh-dependencies

2
आप ग्रहण का उपयोग क्यों करेंगे? खासकर 2018 में!
क्रिस्टोफर पेरी

0

कैश फ़ोल्डर में विशिष्ट निर्भरता का केवल एक मैनुअल विलोपन काम करता है ... उद्यम रेपो में एक सहकर्मी द्वारा बनाया गया एक आर्टिफैक्ट।


0

मेरे मामले में उपरोक्त में से किसी ने भी काम नहीं किया, जो मैंने किया:

  • में build.gradle, मेरे द्वारा किए गए अनसुलझे आयातों से संबंधित निर्भरता पर टिप्पणी करना
  • "अब सिंक करें" पर क्लिक करें
  • जो मैंने अभी टिप्पणी की थी, उसे रद्द करना
  • "सिंक नाउ" पर फिर से क्लिक करें

फिर मेरा आयात फिर से ठीक से हल हो गया।


-7

आपको इसे फिर से डाउनलोड करने की आवश्यकता है, इसलिए आप दूषित फ़ाइल को मैन्युअल रूप से डाउनलोड और बदल सकते हैं और फिर से अपनी परियोजना को सिंक कर सकते हैं। इस स्थान पर जाएं C: \ users [उपयोगकर्ता नाम] .gradle \ आवरण \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip यहाँ gradle3.3allzip हटाएं और इसे फिर से इस साइट से डाउनलोड करके प्रतिस्थापित करें https: / /services.gradle.org/distributions/ समान फ़ाइल ढूंढें और उसे उस स्थान पर डाउनलोड करें और पेस्ट करें और फिर अपनी परियोजना सिंक करें। उम्मीद है कि यह आपके लिए भी उपयोगी होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.