מציאת תלות דרגה שלא נוצלה

1. סקירה כללית

לפעמים במהלך הפיתוח, אנו עשויים בסופו של דבר להוסיף יותר תלות ממה שאנחנו משתמשים.

במדריך מהיר זה, נראה כיצד להשתמש בתוסף מוך הערפילית של Gradle כדי לזהות ולתקן בעיות כאלה.

2. התקנה ותצורה

אנו משתמשים במערך רב-מודולי של Gradle 5 בדוגמאות שלנו.

תוסף זה פועל רק לבנייה מבוססת גרובי קבצים.

בואו להגדיר את זה בקובץ בניית פרויקט הבסיס:

תוספים {id "nebula.lint" גרסה "16.9.0"} תיאור = "פרויקט שורש Gradle 5" allprojects {להחיל תוסף: "java" להחיל תוסף: "nebula.lint" gradleLint {rules = ['unused-dependency'] } group = "com.baeldung" version = "0.0.1" sourceCompatibility = "1.8" targetCompatibility = "1.8" מאגרים {jcenter ()}}

אנו יכולים רק להגדיר זאת בדרך זו לבניית פרויקטים מרובים לעת עתה. פירוש הדבר שאיננו יכולים להחיל אותו בנפרד בכל מודול.

לאחר מכן, בואו להגדיר את התלות שלנו במודול:

תיאור = "דרגת דוגמא לתלות תלויה בשימוש" תלות {יישום ('com.google.guava: guava: 29.0-jre') testImplementation ('junit: junit: 4.12')}

עכשיו בואו נוסיף מחלקה ראשית פשוטה במקורות המודולים שלנו:

מחלקה ציבורית UnusedDependencies {public static void main (String [] args) {System.out.println ("שלום עולם"); }}

נבנה על זה קצת מאוחר יותר ונראה כיצד התוסף עובד.

3. תרחישים ודוחות איתור

התוסף מחפש בצנצנות הפלט כדי לזהות אם משתמשים בתלות או לא.

למרות זאת, בהתאם למספר תנאים, זה יכול לתת לנו תוצאות שונות.

נחקור את המקרים המעניינים יותר בסעיפים הבאים.

3.1. תלות בלתי מנוצלת

עכשיו כשיש לנו את ההתקנה, בואו נראה את מקרה השימוש הבסיסי. אנו מעוניינים בתלות שאינה בשימוש.

בואו הפעל את מוך גרדל מְשִׁימָה:

$ ./gradlew lintGradle> משימה: lintGradle נכשל # פלט כישלון הושמט אזהרה תלות שאינה בשימוש תלות זו אינה בשימוש וניתן להסיר תלות שאינה בשימוש / build.gradle: 6 יישום ('com.google.guava: guava: 29.0-jre' ) ✖ בעיה אחת (0 שגיאות, אזהרה אחת) כדי להחיל תיקונים באופן אוטומטי, הפעל את fixGradleLint, בדוק ובצע את השינויים. # פלט כשל נוסף 

בוא נראה מה קרה. יש לנו תלות בלתי מנוצלת (גויאבה) בשלנו compileClasspath תְצוּרָה.

אם אנחנו לָרוּץ fixGradleLint מְשִׁימָה כפי שמציע התוסף, התלות מוסרת אוטומטית משלנו build.gradle.

עם זאת, בואו נשתמש בהיגיון דמה עם התלות שלנו במקום:

סטטי ציבורי ריק ריק (String [] args) {System.out.println ("שלום עולם"); useGuava (); } שימוש בטל סטטי פרטיGuava () {List list = ImmutableList.of ("Baledung", "is", "cool"); System.out.println (list.stream (). Collect (Collectors.joining (""))); }

אם נבצע מחדש את זה לא נקבל שגיאות נוספות:

$ ./gradlew lintGradle BUILD SUCCESSFUL ב 559ms 3 משימות הניתנות לפעולה: 1 שבוצעה, 2 עדכניות

3.2. שימוש בתלות מעבר

בואו נכלול תלות נוספת:

תלות {יישום ('com.google.guava: guava: 29.0-jre') יישום ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')}

הפעם, בואו נשתמש במשהו מתלות מעבר:

סטטי ציבורי ריק ריק (String [] args) {System.out.println ("שלום עולם"); useGuava (); useHttpCore (); } // שיטות אחרות חלל סטטי פרטי useHttpCore () {SSLContextBuilder.create (); }

בוא נראה מה קורה:

$ ./gradlew lintGradle> משימה: lintGradle FAILED # פלט כשל הושמט אזהרה ללא תלות בשיעור אחד או יותר בכיתות ב- org.apache.http רכיבים: httpcore: 4.4.13 נדרשים על ידי הקוד שלך ישירות (אין תיקון אוטומטי זמין) אזהרה לא בשימוש- תלות תלות זו אינה בשימוש וניתן להסיר תלות בלתי בשימוש / build.gradle: 8 יישום ('org.apache.httpcomponents: httpclient: 4.5.12') problems 2 בעיות (0 שגיאות, 2 אזהרות)

אנו מקבלים שתי שגיאות. השגיאה הראשונה אומרת בערך שעלינו להתייחס httpcore באופן ישיר.

ה SSLContextBuilder במדגם שלנו הוא למעשה חלק ממנו.

השגיאה השנייה אומרת שאנחנו לא משתמשים בשום דבר מ- httpclient.

אם אנו משתמשים בתלות מעבר, התוסף אומר לנו להפוך אותו ישיר.

בואו נציץ בעץ התלות שלנו:

$ ./gradlew תלות שאינה בשימוש: תלות - תצורת קומפילציה Classpath> משימה: תלות שאינה בשימוש: תלות ----------------------------- ------------------------------- פרויקט: תלות שאינה בשימוש - דוגמה לתלות חסרת שימוש בשיעור --------- -------------------------------------------------- - compileClasspath - הידר מסלול עבור ערכת המקור 'ראשי'. + --- com.google.guava: גויאבה: 29.0-jre | + --- com.google.guava: failureaccess: 1.0.1 | + --- com.google.guava: listenablefuture: 9999.0-ריק-כדי למנוע התנגשות עם-גויאבה | + --- com.google.code.findbugs: jsr305: 3.0.2 | + --- org.checkerframework: checker-qual: 2.11.1 | + --- com.google.errorprone: error_prone_annotations: 2.3.4 | \ --- com.google.j2objc: j2objc- הערות: 1.3 \ --- org.apache.httpcomponents: httpclient: 4.5.12 + --- org.apache.httpcomponents: httpcore: 4.4.13 + --- commons -logging: commons-logging: 1.2 \ --- commons-codec: commons-codec: 1.11

במקרה זה אנו יכולים לראות זאת httpcore מובא על ידי httpclient.

3.3. שימוש בתלות עם השתקפות

מה לגבי כאשר אנו משתמשים בבבואה?

בואו נשפר מעט את הדוגמה שלנו:

סטטי ציבורי ריק ריק (String [] args) {System.out.println ("שלום עולם"); useGuava (); useHttpCore (); useHttpClientWithReflection (); } // שיטות אחרות חלל סטטי פרטי useHttpClientWithReflection () {נסה {Class httpBuilder = Class.forName ("org.apache.http.impl.client.HttpClientBuilder"); שיטה create = httpBuilder.getMethod ("צור", null); create.invoke (httpBuilder, null); } לתפוס (חריג e) {e.printStackTrace (); }}

בואו בואו להפעיל מחדש את משימת Gradle:

$ ./gradlew lintGradle> משימה: lintGradle FAILED # פלט כשל הושמט אזהרה ללא תלות בשיעור אחד או יותר בכיתות ב- org.apache.http רכיבים: httpcore: 4.4.13 נדרשים על ידי הקוד שלך ישירות (אין תיקון אוטומטי זמין) אזהרה לא בשימוש- תלות תלות זו אינה בשימוש וניתן להסיר תלות שאינה בשימוש / build.gradle: 9 יישום ('org.apache.httpcomponents: httpclient: 4.5.12') problems 2 בעיות (0 שגיאות, 2 אזהרות) 

מה קרה? השתמשנו HttpClientBuilder מהתלות שלנו (httpclient) אבל עדיין יש שגיאות.

אם אנו משתמשים בספרייה עם השתקפות, התוסף אינו מזהה את השימוש בה.

כתוצאה מכך אנו יכולים לראות את אותן שתי שגיאות.

באופן כללי, עלינו להגדיר תלות כמו זמן ריצה בלבד.

3.4. יצירת דוחות

בפרויקטים גדולים, מספר השגיאות שהוחזרו בטרמינל הופך למאתגר לטיפול.

בואו להגדיר את התוסף כך שייתן לנו דוח במקום:

allprojects {להחיל תוסף: "java" להחיל תוסף: "nebula.lint" gradleLint {rules = ['unused-dependency'] reportFormat = 'text'} // פרטים אחרים הושמטו}

בואו הפעל את createGradleLintReport מְשִׁימָה ובדוק את תפוקת הבנייה שלנו:

$ ./gradlew createGradleLintReport # פלט המשימות הושמט $ cat unused-dependencies / build / reports / gradleLint / unused-dependencies.txt דוח CodeNarc - 20 ביוני 2020, 15:25:28 סיכום: TotalFiles = 1 FilesWithViolations = 1 P1 = 0 P2 = 3 P3 = 0 קובץ: /home/user/tutorials/gradle-5/unused-dependencies/build.gradle הפרה: כלל = תלות שאינה בשימוש P = 2 שורה = null Msg = [מחלקה אחת או יותר בארגון. apache.http רכיבים: httpcore: 4.4.13 נדרשים על ידי הקוד שלך ישירות] הפרה: כלל = תלות שאינה בשימוש P = 2 שורה = 9 Msg = [תלות זו אינה בשימוש וניתנת להסרה] Src = [יישום ('org.apache) .http רכיבים: httpclient: 4.5.12 ')] הפרה: כלל = תלות שאינה בשימוש P = 2 קו = 17 Msg = [תלות זו אינה בשימוש וניתנת להסרה] Src = [testImplementation (' junit: junit: 4.12 ')] [CodeNarc (//www.codenarc.org) v0.25.2] 

כעת הוא מגלה תלות שאינה בשימוש ב- testCompileClasspath תְצוּרָה.

זו, למרבה הצער, התנהגות לא עקבית של התוסף. כתוצאה מכך אנו מקבלים כעת שלוש שגיאות.

4. מסקנה

במדריך זה ראינו כיצד למצוא תלות שאינה בשימוש בבניית Gradle.

ראשית, הסברנו על ההתקנה הכללית. לאחר מכן, בדקנו את השגיאות שדווחו עם תלות שונות ואת השימוש בהן.

לבסוף ראינו כיצד ליצור דוחות מבוססי טקסט.

כרגיל, אנו יכולים למצוא את דגימות הקוד המלאות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found