วิธีค้นหา / ลบการอ้างอิงที่ไม่ได้ใช้ใน Gradle


คำตอบ:


72

อัปเดต: 28-06-2016: Android รองรับการพึ่งพาที่ไม่ได้ใช้

ในเดือนมิถุนายน 2017ที่พวกเขาได้รับการปล่อยตัว4.0.0 version และเปลี่ยนชื่อเป็นชื่อโครงการรากไป"gradle-lint-plugin" "nebula-lint-plugin"พวกเขายังได้เพิ่มการสนับสนุน Android ที่จะพึ่งพาไม่ได้ใช้


ในเดือนพฤษภาคม 2559 Gradle ได้ติดตั้งปลั๊กอิน Gradle lintเพื่อค้นหาและลบการพึ่งพาที่ไม่ต้องการ

Gradle Lint Plugin: เอกสารฉบับเต็ม

ปลั๊กอิน Gradle Lint เป็นเครื่องมือ Linter แบบเสียบได้และกำหนดค่าได้สำหรับการระบุและรายงานเกี่ยวกับรูปแบบของการใช้งานในทางที่ผิดหรือการเลิกใช้งานในสคริปต์ Gradle และไฟล์ที่เกี่ยวข้อง

ปลั๊กอินนี้มีกฎต่างๆ กฎการพึ่งพาที่ไม่ได้ใช้เป็นหนึ่งในนั้น มีลักษณะเฉพาะสามประการ

  1. ลบการอ้างอิงที่ไม่ได้ใช้
  2. ส่งเสริมการอ้างอิงแบบสกรรมกริยาที่โค้ดของคุณใช้โดยตรงเพื่อการอ้างอิงลำดับแรกอย่างชัดเจน
  3. ย้ายการอ้างอิงไปยังการกำหนดค่า 'ถูกต้อง'

หากต้องการใช้กฎให้เพิ่ม:

gradleLint.rules += 'unused-dependency'

รายละเอียดของกฎการพึ่งพาที่ไม่ได้ใช้มีให้ในส่วนสุดท้าย

วิธีใช้ปลั๊กอิน Gradle lint:

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

สำหรับการสร้างองค์กรเราขอแนะนำให้กำหนดกฎ lint ในสคริปต์ init.gradle หรือในสคริปต์ Gradle ที่รวมอยู่ใน 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. ย้ายการอ้างอิงไปยังการกำหนดค่า 'ถูกต้อง'

  • Webjars ถูกย้ายไปยังคอนฟิกูเรชันรันไทม์
  • ไฟล์ JAR ที่ไม่มีคลาสและเนื้อหาใด ๆนอก META-INF จะถูกย้ายไปที่รันไทม์
  • 'xerces', 'xercesImpl', 'xml-apis' ควรอยู่ในขอบเขตรันไทม์เสมอ
  • ผู้ให้บริการ (ไฟล์ JAR ที่มี META-INF / services) เช่น mysql-connector-java จะถูกย้ายไปที่รันไทม์หากไม่มีการอ้างอิงเวลาคอมไพล์ที่พิสูจน์ได้
  • การอ้างอิงจะถูกย้ายไปยังการกำหนดค่าชุดแหล่งที่มาสูงสุดที่เป็นไปได้ ตัวอย่างเช่น 'junit' ถูกย้ายไปยัง testCompile เว้นแต่จะมีการพึ่งพาอย่างชัดเจนในชุดแหล่งที่มาหลัก (หายาก)


อัปเดต: ปลั๊กอินก่อนหน้า

สำหรับข้อมูลประเภทของคุณฉันต้องการแบ่งปันเกี่ยวกับปลั๊กอินก่อนหน้านี้

  1. ปลั๊กอิน Gradle ที่ค้นหาการอ้างอิงที่ไม่ได้ใช้การประกาศและสกรรมกริยาคือcom.github.nullstress.dependency-analysis

แต่เวอร์ชั่น 1.0.3 ใหม่ล่าสุดจะถูกสร้างขึ้น 23 ธันวาคม 2014 หลังจากนั้นไม่มีการอัปเดตใด ๆ

หมายเหตุ: วิศวกรของเราหลายคนสับสนเกี่ยวกับปลั๊กอินนี้เนื่องจากพวกเขาอัปเดตเฉพาะหมายเลขเวอร์ชันเท่านั้นไม่มีอะไรอื่น


gradle-lint-plugin เข้ากันได้กับ Android หรือไม่
Jaythaking

@Jaythaking ใช่ค่ะ คุณสามารถเข้าไปที่ลิงค์นี้: tools.android.com/tech-docs/new-build-system/… . หวังว่ามันจะชี้แจงคุณ
SkyWalker

@Jaythaking - เพิ่งเพิ่มการสนับสนุนการทดลองสำหรับ Android ที่ไม่ได้ใช้ในวันนี้ด้วยเวอร์ชัน 4.0.0
jkschneider

4
ปลั๊กอินนี้ใช้ไม่ได้กับ kotlin dsl พวกเขาไม่มีแผนรองรับ
snowe

3
นอกจากนี้ยังไม่ได้ทำงานกับการกำหนดค่า gradle ใหม่ (เช่นimplementationและapi) และยิ่งแย่ลงแนะนำให้เปลี่ยนจากคนใหม่กับคนเก่าที่เลิกใช้แล้ว (เช่นcompile, testCompileฯลฯ )
Laurence Gonsalves

8

โครงการที่กล่าวถึงในคำตอบก่อนหน้านี้ดูเหมือนจะตายไปแล้ว ผมใช้gradle พึ่งพา-วิเคราะห์ การตั้งค่าทำได้ง่าย:

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

apply plugin: 'ca.cutterslade.analyze'

จากนั้นทำ:

$ gradle analyzeDependencies

4
ฉันพบข้อผิดพลาดนี้: 'การซิงค์ Gradle ล้มเหลว: ไม่พบงานที่มีชื่อ' คลาส 'ในโครงการ'
Pawan

ฉันได้รับ stackOverflowException ที่ทำเช่นนั้น ไม่มีข้อมูลที่ชัดเจนว่าอะไรเป็นสาเหตุของสิ่งนี้ ฉันคิดว่าอาจมีปัญหาการพึ่งพาแบบวงกลมที่นี่ แต่มันจะเป็นความคิดที่ดีที่ฉันเครื่องมือบอกฉันว่าที่ไหน
SGal

1
@Pawan ปลั๊กอินนี้ใช้ไม่ได้กับโครงการ Android และจะไม่มีการเปลี่ยนแปลงในเร็ว ๆ นี้ พิสูจน์: github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat

8

ผมได้มีจำนวนมากของโชคใช้พึ่งพาปลั๊กอินวิเคราะห์ Gradle ในการเริ่มต้นให้เพิ่มสองสิ่งต่อไปนี้ในสคริปต์สร้าง Gradle ของคุณ

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

และ

apply plugin: "dependencyAnalysis"

gradle analyzeเมื่อผู้ที่อยู่ในสถานที่วิ่ง หากมีการอ้างอิงที่ไม่ได้ใช้งานคุณจะได้รับความล้มเหลวในการสร้างที่แสดงผลลัพธ์ที่คล้ายกับข้อความด้านล่างรวมทั้งรายการของการอ้างอิงที่ไม่ได้ใช้งาน (ทั้งที่ประกาศและสกรรมกริยา) ความล้มเหลวของการสร้างนั้นมีประโยชน์มากหากคุณต้องการบังคับว่าไม่ควรมีการอ้างอิงที่ไม่ได้ใช้ผ่านการสร้าง CI

: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
ฉันได้รับ "การดำเนินการล้มเหลวสำหรับงาน ': app: วิเคราะห์'> โปรเจ็กต์ไม่ได้ใช้ปลั๊กอิน java" หากฉันเพิ่ม "ใช้ปลั๊กอิน: 'java'" ฉันจะบอกว่ามันไม่สามารถใช้งานร่วมกับปลั๊กอินแอปพลิเคชัน Android ที่มีอยู่ได้ ความคิดใด ๆ
Alex Black

ดูเหมือนว่าเป็นสิ่งที่เฉพาะเจาะจงกับปลั๊กอินแอปพลิเคชัน Android ฉันหวังว่าฉันจะช่วยได้ แต่ฉันไม่มีประสบการณ์กับ Android!
jstricker

ปลั๊กอินมีข้อบกพร่องเช่นเมื่อคุณมีการเรียกแบบคงที่ไปยังการอ้างอิงซึ่งไม่ได้นำมาพิจารณา
ToYonos

ดูเหมือนว่าจะเลิกใช้งานปลั๊กอิน linter
Ruthi Ruth

2

ฉันเพิ่งเรียนรู้เกี่ยวกับสิ่งนี้: https://plugins.gradle.org/plugin/com.autonomousapps.dependency-analysis

Github

จากรูปลักษณ์มันอยู่ระหว่างการพัฒนา แต่ฉันยังไม่ได้ทดสอบ

แก้ไข: จริงๆแล้วมันยอดเยี่ยมมากมีคำแนะนำมากมาย (เช่นจะใช้ api กับการใช้งานหรือไม่)


0

หมายเหตุบรรณาธิการ: คำตอบนี้ล้าสมัย โปรดดูคำตอบด้านบน

คุณสามารถลองใช้ปลั๊กอิน com.github.nullstress.dependency-analysis Gradle

สร้างข้อมูลโค้ดสคริปต์สำหรับใช้ใน Gradle ทุกเวอร์ชัน:

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

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

สร้างตัวอย่างสคริปต์สำหรับกลไกปลั๊กอินใหม่การบ่มเพาะที่นำมาใช้ใน Gradle 2.1:

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

นอกจากนี้ยังมีเธรด ( Gradle เทียบเท่ากับ "mvn dependency: analysis " หรือไม่ ) ในฟอรัม Gradle เกี่ยวกับเรื่องนี้


ปลั๊กอินนี้ดูเหมือนจะเป็นโครงการที่ตายแล้ว ... อย่างน้อยก็มี Gradle เวอร์ชันปัจจุบัน
cjstehno

0

โครงการเกี่ยวกับคำตอบในอดีตส่วนใหญ่นั้นตายไปแล้ว แต่การวิเคราะห์การพึ่งพาอาศัยกันอย่างค่อยเป็นค่อยไปดูเหมือนจะยังมีชีวิตอยู่ ณ วันที่ 2016-05-30


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