Come trovare / rimuovere le dipendenze inutilizzate in Gradle


Risposte:


72

AGGIORNAMENTO: 28-06-2016: supporto Android alle dipendenze inutilizzate

A giugno 2017 , hanno rilasciato 4.0.0 version e rinominato il nome del progetto radice "gradle-lint-plugin"in "nebula-lint-plugin". Hanno anche aggiunto il supporto per Android alla dipendenza inutilizzata .


A maggio 2016 Gradle ha implementato il plug-in Gradle lint per trovare e rimuovere dipendenze indesiderate

Plugin Gradle Lint: documentazione completa

Il plugin Gradle Lint è uno strumento di linter collegabile e configurabile per identificare e segnalare modelli di uso improprio o deprecazioni negli script Gradle e nei file correlati.

Questo plugin ha varie regole. La regola di dipendenza inutilizzata è una di queste. Ha tre caratteristiche specifiche.

  1. Rimuove le dipendenze inutilizzate.
  2. Promuove le dipendenze transitive utilizzate direttamente dal codice per esplicite dipendenze del primo ordine.
  3. Riposiziona le dipendenze nella configurazione "corretta".

Per applicare la regola, aggiungi:

gradleLint.rules += 'unused-dependency'

I dettagli della regola di dipendenza inutilizzata sono forniti nell'ultima parte.

Per applicare il plugin Gradle lint:

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

In alternativa:

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

apply plugin: 'nebula.lint'

Definisci le regole contro le quali desideri creare lanugine:

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

Per una build aziendale, si consiglia di definire le regole lint in uno script init.gradle o in uno script Gradle incluso tramite il meccanismo di applicazione Gradle da.

Per progetti multimodulo, consigliamo di applicare il plugin in un allprojectsblocco:

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


I dettagli della regola di dipendenza inutilizzata sono forniti in questa parte

Per applicare la regola, aggiungi:

gradleLint.rules += 'unused-dependency'

La regola ispeziona i file binari compilati provenienti dai set di sorgenti del tuo progetto alla ricerca di riferimenti di classe e fa corrispondere quei riferimenti alle dipendenze che hai dichiarato nel blocco delle dipendenze .

In particolare, la regola apporta le seguenti modifiche alle dipendenze:

1. Rimuove le dipendenze inutilizzate

  • I jar in stile familiare come com.amazonaws: aws-java-sdk vengono rimossi, poiché non contengono alcun codice

2. Promuove le dipendenze transitive utilizzate direttamente dal codice in dipendenze esplicite del primo ordine

  • Questo ha l'effetto collaterale di suddividere i file JAR in stile familiare, come com.amazonaws: aws-java-sdk, nelle parti che stai effettivamente utilizzando e aggiungerle come dipendenze del primo ordine

3. Riposiziona le dipendenze nella configurazione "corretta"

  • I webjar vengono spostati nella configurazione runtime
  • I file JAR che non contengono classi e contenuti al di fuori di META-INF vengono spostati in runtime
  • 'xerces', 'xercesImpl', 'xml-apis' dovrebbero sempre avere un ambito di runtime
  • I fornitori di servizi (file JAR contenenti META-INF / servizi) come mysql-connector-java vengono spostati in runtime se non è presente alcun riferimento dimostrabile in fase di compilazione
  • Le dipendenze vengono spostate nella configurazione del set di origini più alta possibile. Ad esempio, "junit" viene riposizionato in testCompile a meno che non vi sia una dipendenza esplicita da esso nel set di sorgenti principale (raro).


AGGIORNAMENTO: plugin precedenti

Per le vostre gentili informazioni, desidero condividere i plugin precedenti

  1. Il plugin Gradle che trova le dipendenze inutilizzate, dichiarate e transitive è com.github.nullstress.dependency-analysis

Ma la sua ultima versione 1.0.3 è stata creata il 23 dicembre 2014 . Dopo di che non ci sono aggiornamenti.

NB: Molti dei nostri ingegneri sono confusi riguardo a questo plugin poiché hanno aggiornato solo il numero di versione, nient'altro.


Il plugin gradle-lint è compatibile con Android?
Jaythaking

@ Jaythaking sì. Puoi passare attraverso questo link: tools.android.com/tech-docs/new-build-system/… . Spero che ti chiarisca.
SkyWalker

@Jaythaking - appena aggiunto il supporto sperimentale per le dipendenze inutilizzate di Android oggi con la versione 4.0.0
jkschneider

4
Questo plugin purtroppo non funziona con il dsl di kotlin. Non hanno intenzione di sostenerlo.
nevica il

3
Non fa anche il lavoro con le nuove configurazioni Gradle (ad esempio: implementatione api), e, peggio ancora, raccomanda passando da quelli nuovi a quelli vecchi obsoleti (ad esempio: compile, testCompilee così via).
Laurence Gonsalves

8

Il progetto menzionato nelle risposte precedenti sembra essere morto. Uso l' analisi della dipendenza graduale . La configurazione è semplice:

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

apply plugin: 'ca.cutterslade.analyze'

Quindi fa:

$ gradle analyzeDependencies

4
Sto affrontando questo errore: "Sincronizzazione Gradle non riuscita: attività con nome" classi "non trovata nel progetto"
Pawan

Ottengo stackOverflowException che lo fa. Nessuna informazione precisa sulla causa di questo però. Penso che potrebbe esserci un problema di dipendenza circolare qui, ma sarebbe un'ottima idea se lo strumento mi dicesse dove.
SGal

1
@Pawan questo plugin non funziona con i progetti Android e questo non cambierà presto. Prova: github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat

8

Ho avuto molta fortuna usando il plugin Gradle Dependency Analysis . Per iniziare, aggiungi le seguenti due cose al tuo script di build Gradle.

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

e

apply plugin: "dependencyAnalysis"

Una volta che sono a posto, corri gradle analyze. Se ci sono dipendenze inutilizzate, otterrai un errore di compilazione che mostra un output simile al testo seguente, più un elenco delle dipendenze inutilizzate (sia dichiarate che transitive). L'errore di compilazione è davvero utile se si desidera imporre che non vi siano dipendenze inutilizzate tramite una compilazione 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
Ricevo il messaggio "Esecuzione non riuscita per attività": app: analizza ".> Il plug-in Java non è applicato al progetto." Se aggiungo "applica plug-in: 'java'", mi viene detto che non è compatibile con il plug-in dell'applicazione Android esistente. qualche idea?
Alex Black

Sembra che sia qualcosa di specifico con il plug-in dell'applicazione Android. Vorrei poterti aiutare, ma non ho esperienza con Android!
jstricker

Il plugin ha dei bug, come ad esempio quando hai una chiamata statica a una dipendenza, non presi in considerazione.
ToYonos

questo sembra essere deprecato per il plugin
linter


0

Nota del redattore: questa risposta non è aggiornata. Si prega di vedere la risposta in alto .

Puoi provare il plugin Gradle com.github.nullstress.dependency-analysis

Crea snippet di script da utilizzare in tutte le versioni di Gradle:

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

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

Crea snippet di script per il nuovo meccanismo di incubazione dei plugin introdotto in Gradle 2.1:

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

Inoltre, c'è un thread ( Esiste un equivalente Gradle di "dipendenza mvn: analizza"? ) Nel forum Gradle su questo argomento .


Questo plugin sembra essere un progetto morto ... almeno con l'attuale versione di Gradle.
cjstehno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.