ग्रैडल में अप्रयुक्त निर्भरताओं को कैसे ढूंढें / निकालें


जवाबों:


72

अद्यतन: 28-06-2016: अप्रयुक्त-निर्भरता के लिए Android समर्थन

में जून, 2017 में, वे जारी किया है 4.0.0 version और जड़ परियोजना का नाम बदल "gradle-lint-plugin"लिए "nebula-lint-plugin"। उन्होंने अप्रयुक्त-निर्भरता के लिए Android समर्थन भी जोड़ा है


में मई वर्ष 2016 Gradle लागू किया गया है Gradle फाहा प्लगइन खोजने और अवांछित निर्भरता को हटाने के लिए

ग्रेड लिंट प्लगिन: पूर्ण प्रलेखन

ग्रैड लिंट प्लगइन ग्रैड लिपियों और संबंधित फाइलों में दुरुपयोग या अवक्षेपण के पैटर्न की पहचान करने और रिपोर्ट करने के लिए एक प्लग करने योग्य और विन्यास योग्य लिंटर उपकरण है।

इस प्लगइन के विभिन्न नियम हैं। अप्रयुक्त निर्भरता नियम उनमें से एक है। इसकी तीन विशिष्ट विशेषताएं हैं।

  1. अप्रयुक्त निर्भरता को हटाता है।
  2. स्पष्ट रूप से पहले क्रम पर निर्भरता के लिए आपके कोड द्वारा सीधे उपयोग की जाने वाली सकर्मक निर्भरता को बढ़ावा देता है।
  3. निर्भरता को 'सही' विन्यास से जोड़ता है।

नियम लागू करने के लिए, जोड़ें:

gradleLint.rules += 'unused-dependency'

अप्रयुक्त निर्भरता नियम का विवरण अंतिम भाग में दिया गया है।

ग्रेड लिंट प्लगइन लागू करने के लिए:

buildscript { repositories { jcenter() } }
plugins {
  id 'nebula.lint' version '0.30.2'
}

वैकल्पिक रूप से:

buildscript {
  repositories { jcenter() }
  dependencies {
    classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
  }
}

apply plugin: 'nebula.lint'

परिभाषित करें कि आप किन नियमों के विरूद्ध ऋण देना चाहेंगे:

gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like

एक एंटरप्राइज़ बिल्ड के लिए, हम एक init.gradle स्क्रिप्ट या ग्रैडल स्क्रिप्ट में लिंट नियमों को परिभाषित करने की सलाह देते हैं जो ग्रैडल तंत्र के माध्यम से लागू होते हैं।

मल्टीमॉडल परियोजनाओं के लिए, हम एक allprojectsब्लॉक में प्लगइन लगाने की सलाह देते हैं :

allprojects {
  apply plugin: 'nebula.lint'
  gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like
}


अप्रयुक्त निर्भरता नियम का विवरण इस भाग में दिया गया है

नियम लागू करने के लिए, जोड़ें:

gradleLint.rules += 'unused-dependency'

नियम आपके प्रोजेक्ट के स्रोत सेट से निकलने वाले संकलित बायनेरिज़ का निरीक्षण करता है जो वर्ग संदर्भों की तलाश करता है और उन निर्भरताओं के संदर्भों से मेल खाता है जिन्हें आपने अपनी निर्भरता ब्लॉक में घोषित किया है ।

विशेष रूप से, नियम निर्भरता के लिए निम्नलिखित समायोजन करता है:

1. अप्रयुक्त निर्भरता को हटाता है

  • Com.amazonaws जैसे परिवार-शैली के जार: aws-java-sdk हटा दिए जाते हैं, क्योंकि उनमें कोई कोड नहीं होता है

2. पहले कोड पर निर्भरता के लिए सीधे आपके कोड द्वारा उपयोग की जाने वाली सकर्मक निर्भरता को बढ़ावा देता है

  • यह पारिवारिक शैली JAR फ़ाइलों को तोड़ने का साइड इफेक्ट है, जैसे com.amazonaws: aws-java-sdk, उन हिस्सों में जो आप वास्तव में उपयोग कर रहे हैं, और उन्हें पहले ऑर्डर निर्भरता के रूप में जोड़ रहे हैं।

3. 'सही' कॉन्फ़िगरेशन के लिए निर्भरता को स्थानांतरित करता है

  • वेबजेर्स को रनटाइम कॉन्फ़िगरेशन में ले जाया जाता है
  • JAR फ़ाइलों में मेटा-INF के बाहर कोई भी वर्ग और सामग्री नहीं है, रनटाइम में ले जाया जाता है
  • 'xerces', 'xercesImpl', 'xml-apis' को हमेशा रनटाइम स्कूप किया जाना चाहिए
  • सर्विस प्रोवाइडर (JAR फाइलें जिनमें META-INF / सेवाएं हैं) जैसे mysql-कनेक्टर-जावा को रनटाइम में स्थानांतरित कर दिया जाता है यदि कोई साबित करने योग्य संकलन-समय संदर्भ नहीं है
  • निर्भरता को संभव उच्चतम स्रोत सेट कॉन्फ़िगरेशन में ले जाया जाता है। उदाहरण के लिए, 'junit' को testCompile में स्थानांतरित किया जाता है जब तक कि मुख्य स्रोत सेट (दुर्लभ) में उस पर स्पष्ट निर्भरता न हो।


अद्यतन: पिछले प्लगइन्स

आपकी तरह की जानकारी के लिए, मैं पिछले प्लगइन्स के बारे में साझा करना चाहता हूं

  1. ग्रेड्ड प्लगइन जो अप्रयुक्त निर्भरता पाता है, घोषित और सकर्मक है। Com .github.nullstress.dependence-analysis

लेकिन इसका नवीनतम संस्करण 1.0.3 23 दिसंबर 2014 को बनाया गया है । उसके बाद कोई अपडेट नहीं है।

NB: हमारे कई इंजीनियर इस प्लगइन के बारे में भ्रमित हो रहे हैं क्योंकि उन्होंने केवल संस्करण संख्या को अपडेट किया है, और कुछ नहीं।


क्या gradle-lint-plugin Android के साथ संगत है?
Jaythaking

@ जयतेक हाँ। आप इस लिंक पर जा सकते हैं: tools.android.com/tech-docs/new-build-system/… । आशा है कि यह आपको स्पष्ट करेगा।
स्काईवल्कर

@Jayhahaking - अभी Android अप्रयुक्त निर्भरता के लिए प्रायोगिक समर्थन जोड़ा गया संस्करण 4.0.0 के साथ
jkschneider

4
यह प्लगइन दुख की बात है कि कोटलिन dsl के साथ काम नहीं करता है। उनकी इसके समर्थन की कोई योजना नहीं है।
18

3
यह भी नई Gradle विन्यास साथ काम नहीं करता (जैसे: implementationऔर api), और भी बदतर है, वर्ष में अमान्य हो चुके लोगों के लिए नए लोगों को से बदल रहा है की सिफारिश (जैसे: compile, testCompile, आदि)।
लॉरेंस गोंसाल्वेस

8

पहले के उत्तरों में वर्णित परियोजना मृत प्रतीत होती है। मैं वर्गीकृत-निर्भरता-विश्लेषण का उपयोग करता हूं । सेटअप सरल है:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'ca.cutterslade.gradle:gradle-dependency-analyze:1.0.3'
  }
}

apply plugin: 'ca.cutterslade.analyze'

फिर करो:

$ gradle analyzeDependencies

4
मैं इस त्रुटि का सामना कर रहा हूँ: 'ग्रैडल सिंक विफल: टास्क नाम के साथ कार्य' प्रोजेक्ट में नहीं मिला '
पवन

मैं stackOverflowException ऐसा कर रहा हूँ। हालांकि इसकी कोई सटीक जानकारी नहीं है। मुझे लगता है कि यहाँ एक परिपत्र निर्भरता मुद्दा हो सकता है, लेकिन यह एक महान विचार होगा जो मुझे उपकरण ने मुझे बताया था।
एसजील

1
@ पवन इस प्लगइन Android परियोजनाओं के साथ काम नहीं करता है, और यह जल्द ही किसी भी समय बदलने के लिए नहीं जा रहा है। प्रमाण: github.com/wfhartford/gradle-d
dependency

8

ग्रैड डिपेंडेंसी एनालिसिस प्लगिन का उपयोग करने के लिए मुझे बहुत कुछ मिला है । इसके साथ शुरुआत करने के लिए, अपने ग्रेड बिल्ड स्क्रिप्ट में निम्नलिखित दो चीजें जोड़ें।

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
    }
}

तथा

apply plugin: "dependencyAnalysis"

एक बार जब वे जगह में हों, तो दौड़ें gradle analyze। यदि अप्रयुक्त निर्भरताएँ हैं, तो आपको एक बिल्ड विफलता मिलेगी जो नीचे दिए गए पाठ के समान आउटपुट दिखाती है, साथ ही अप्रयुक्त निर्भरताओं की सूची (घोषित और सकर्मक दोनों)। बिल्ड विफलता वास्तव में आसान है यदि आप यह लागू करना चाहते हैं कि सीआई बिल्ड के माध्यम से अप्रयुक्त निर्भरताएं नहीं होनी चाहिए।

:foo:analyze FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':foo:analyze'.
> The project has unused declared artifacts

3
मुझे "कार्य के लिए निष्पादन विफल हो गया है ': ऐप: विश्लेषण'।> परियोजना में जावा प्लगइन लागू नहीं है।" अगर मैं "लागू करें प्लगइन: 'जावा' जोड़ता हूं, तो मुझे बताया गया है कि यह मौजूदा एंड्रॉइड एप्लिकेशन प्लगइन के साथ संगत नहीं है। कोई विचार?
एलेक्स ब्लैक

ऐसा लगता है कि यह Android एप्लिकेशन प्लगइन के साथ कुछ विशिष्ट है। काश मैं मदद कर सकता, लेकिन मुझे Android के साथ कोई अनुभव नहीं है!
13

प्लगइन में बग होते हैं, उदाहरण के लिए जब आपके पास एक निर्भरता के लिए स्थिर कॉल होता है, तो इसे ध्यान में नहीं रखा जाता है।
वायोंस


2

मैंने अभी इस बारे में सीखा: https://plugins.gradle.org/plugin/com.autonomousapps.d dependency-alalysis

Github

लग रहा है कि यह सक्रिय विकास के तहत है, लेकिन मैंने अभी तक इसका परीक्षण नहीं किया है।

संपादित करें: वास्तव में यह बहुत बढ़िया है, यह बहुत सारी सलाह देता है (जैसे कि एपि बनाम कार्यान्वयन का उपयोग करना है)


0

संपादक का नोट: यह उत्तर पुराना है। कृपया शीर्ष उत्तर देखें ।

आप com.github.nullstress.dependency-analysis ग्रैडल प्लगइन की कोशिश कर सकते हैं

सभी ग्रेड संस्करण में उपयोग के लिए स्क्रिप्ट स्निपेट बनाएं:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
  }
}

apply plugin: "com.github.nullstress.dependency-analysis"

ग्रेड 2.1 में पेश किए गए नए, ऊष्मायन, प्लगइन तंत्र के लिए स्क्रिप्ट स्निपेट बनाएं:

plugins {
  id "com.github.nullstress.dependency-analysis" version "1.0.3"
}

इसके अलावा, इस बारे में ग्रैडल फोरम में एक धागा है ( "मावन निर्भरता: विश्लेषण" के बराबर ग्रैडल है? )।


यह प्लगइन एक मृत परियोजना लगती है ... कम से कम वर्तमान ग्रेडल संस्करण के साथ।
cjstehno

0

अधिकांश ऐतिहासिक उत्तरों पर परियोजनाएं मृत हैं, लेकिन 2016-05-30 तक ग्रेडेल -निर्भरता-विश्लेषण जीवित प्रतीत होता है।


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