Cara menemukan / menghapus dependensi yang tidak digunakan di Gradle

128

Saya ingin menemukan dependensi yang tidak terpakai dalam proyek saya. Apakah ada fitur untuk ini di Gradle, seperti di Maven?

Alexander Bezrodniy
sumber

Jawaban:

72

UPDATE: 28-06-2016: Dukungan Android untuk ketergantungan yang tidak digunakan

Pada bulan Juni 2017 , mereka telah merilis 4.0.0 version dan mengganti nama proyek root "gradle-lint-plugin"menjadi "nebula-lint-plugin". Mereka juga telah menambahkan dukungan Android ke unused-dependency .


Pada Mei 2016, Gradle telah mengimplementasikan plugin Gradle lint untuk menemukan dan menghapus dependensi yang tidak diinginkan

Plugin Gradle Lint: Dokumentasi Lengkap

Plugin Gradle Lint adalah alat linter yang dapat dicolokkan dan dikonfigurasi untuk mengidentifikasi dan melaporkan pola penyalahgunaan atau penghentian dalam skrip Gradle dan file terkait.

Plugin ini memiliki berbagai aturan. Aturan Ketergantungan yang Tidak Digunakan adalah salah satunya. Ini memiliki tiga karakteristik khusus.

  1. Menghapus dependensi yang tidak digunakan.
  2. Mempromosikan dependensi transitif yang digunakan langsung oleh kode Anda menjadi dependensi urutan pertama yang eksplisit.
  3. Merelokasi dependensi ke konfigurasi yang 'benar'.

Untuk menerapkan aturan tersebut, tambahkan:

gradleLint.rules += 'unused-dependency'

Rincian Aturan Ketergantungan yang Tidak Digunakan diberikan di bagian terakhir.

Untuk menerapkan plugin Gradle lint:

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

Kalau tidak:

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

apply plugin: 'nebula.lint'

Tentukan aturan mana yang ingin Anda linting:

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

Untuk build perusahaan, sebaiknya tentukan aturan lint dalam skrip init.gradle atau dalam skrip Gradle yang disertakan melalui mekanisme Gradle apply from.

Untuk proyek multimodule, kami merekomendasikan untuk menerapkan plugin dalam satu allprojectsblok:

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


Rincian Aturan Ketergantungan yang Tidak Digunakan diberikan di bagian ini

Untuk menerapkan aturan tersebut, tambahkan:

gradleLint.rules += 'unused-dependency'

Aturan tersebut memeriksa biner terkompilasi yang berasal dari kumpulan sumber proyek Anda mencari referensi kelas dan mencocokkan referensi tersebut dengan dependensi yang telah Anda deklarasikan di blok dependensi Anda .

Secara khusus, aturan tersebut membuat penyesuaian berikut pada dependensi:

1. Menghapus dependensi yang tidak digunakan

  • Guci bergaya keluarga seperti com.amazonaws: aws-java-sdk dihapus, karena tidak berisi kode apa pun

2. Mempromosikan dependensi transitif yang digunakan secara langsung oleh kode Anda menjadi dependensi urutan pertama yang eksplisit

  • Ini memiliki efek samping memecah file JAR gaya keluarga, seperti com.amazonaws: aws-java-sdk, ke dalam bagian yang sebenarnya Anda gunakan, dan menambahkannya sebagai dependensi urutan pertama

3. Merelokasi dependensi ke konfigurasi yang 'benar'

  • Webjars dipindahkan ke konfigurasi runtime
  • File JAR yang tidak berisi kelas dan konten apa pun di luar META-INF dipindahkan ke runtime
  • 'xerces', 'xercesImpl', 'xml-apis' harus selalu dibatasi waktu proses
  • Penyedia layanan (file JAR yang berisi META-INF / services) seperti mysql-connector-java dipindahkan ke runtime jika tidak ada referensi waktu kompilasi yang dapat dibuktikan
  • Dependensi dipindahkan ke konfigurasi kumpulan sumber setinggi mungkin. Misalnya, 'junit' direlokasi ke testCompile kecuali ada ketergantungan eksplisit padanya di set sumber utama (jarang).


UPDATE: Plugin sebelumnya

Sekadar informasi, saya ingin berbagi tentang plugin sebelumnya

  1. Plugin Gradle yang menemukan dependensi yang tidak digunakan, dideklarasikan, dan transitif adalah com.github.nullstress.dependency-analysis

Namun versi terbarunya 1.0.3 dibuat pada 23 Desember 2014 . Setelah itu tidak ada pembaruan apa pun.

NB: Banyak teknisi kami yang bingung tentang plugin ini karena mereka hanya memperbarui nomor versi, tidak ada yang lain.

SkyWalker
sumber
Apakah gradle-lint-plugin kompatibel dengan Android?
Jaythaking
@Yaelahcan Anda dapat membuka tautan ini: tools.android.com/tech-docs/new-build-system/… . Semoga ini akan menjelaskan Anda.
SkyWalker
@Jaythaking - baru saja menambahkan dukungan eksperimental untuk Android yang tidak digunakan dependensi hari ini dengan versi 4.0.0
jkschneider
4
Sayangnya plugin ini tidak berfungsi dengan kotlin dsl. Mereka tidak punya rencana untuk mendukungnya.
snowe
3
Hal ini juga tidak bekerja dengan konfigurasi Gradle baru (misalnya: implementationdan api), dan bahkan lebih buruk, merekomendasikan berubah dari yang baru dengan yang usang lama (misalnya: compile, testCompile, dll).
Laurence Gonsalves
8

Proyek yang disebutkan dalam jawaban sebelumnya tampaknya sudah mati. Saya menggunakan analisis-ketergantungan-gradle . Penyiapannya sederhana:

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

apply plugin: 'ca.cutterslade.analyze'

Kemudian lakukan:

$ gradle analyzeDependencies
Subhash Chandran
sumber
4
Saya menghadapi kesalahan ini: 'Sinkronisasi Gradle gagal: Tugas dengan nama' kelas 'tidak ditemukan dalam proyek'
Pawan
Saya mendapatkan stackOverflowException melakukan itu. Tidak ada informasi pasti apa yang menyebabkan ini. Saya pikir mungkin ada masalah ketergantungan melingkar di sini tetapi itu akan menjadi ide bagus jika alat memberi tahu saya di mana.
SGal
1
@Pawan plugin ini tidak berfungsi dengan proyek Android, dan ini tidak akan berubah dalam waktu dekat. Bukti: github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat
8

Saya sangat beruntung menggunakan Plugin Analisis Ketergantungan Gradle . Untuk memulainya, tambahkan dua hal berikut ke skrip build Gradle Anda.

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

dan

apply plugin: "dependencyAnalysis"

Setelah itu di tempatnya, larilah gradle analyze. Jika ada dependensi yang tidak digunakan, Anda akan mendapatkan kegagalan build yang menunjukkan output yang mirip dengan teks di bawah ini, ditambah daftar dependensi yang tidak digunakan (baik yang dideklarasikan maupun transitif). Kegagalan build sangat berguna jika Anda ingin memastikan bahwa tidak ada dependensi yang tidak digunakan melalui build 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
jstricker
sumber
3
Saya mendapatkan "Eksekusi gagal untuk tugas ': app: menganalisis'.> Proyek tidak menerapkan plugin java." Jika saya menambahkan "terapkan plugin: 'java'" maka saya diberitahu itu tidak kompatibel dengan plugin aplikasi android yang ada. ada ide?
Alex Black
Sepertinya itu sesuatu yang spesifik dengan plugin aplikasi Android. Saya berharap dapat membantu, tetapi saya tidak memiliki pengalaman dengan Android!
jstricker
Plugin memiliki bug, seperti misalnya saat Anda memiliki panggilan statis ke sebuah dependensi, tidak diperhitungkan.
ToYonos
ini tampaknya tidak digunakan lagi untuk plugin linter
Ruthi Ruth
0

Catatan Editor: Jawaban ini sudah ketinggalan zaman. Silakan lihat jawaban teratas .

Anda dapat mencoba plugin Gradle com.github.nullstress.dependency-analysis

Buat cuplikan skrip untuk digunakan di semua versi Gradle:

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

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

Buat cuplikan skrip untuk mekanisme plugin baru yang inkubasi yang diperkenalkan di Gradle 2.1:

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

Selain itu, ada utas ( Apakah ada Gradle yang setara dengan "mvn dependency: analysis "? ) Di forum Gradle tentang ini.

EFernandes
sumber
Plugin ini tampaknya merupakan proyek mati ... setidaknya dengan versi Gradle saat ini.
cjstehno
0

Proyek dengan sebagian besar jawaban historis sudah mati, tetapi analisis ketergantungan bertahap tampaknya masih berjalan pada 2016-05-30.

Brandon McKenzie
sumber
Saya melihat mereka membuat perubahan pada nebula-lint beberapa minggu lalu.
Dibangun di Parris