Cómo encontrar / eliminar dependencias no utilizadas en Gradle

Respuestas:

72

ACTUALIZACIÓN: 28-06-2016: soporte de Android para dependencia no utilizada

En junio de 2017 , lanzaron 4.0.0 version y cambiaron el nombre del proyecto raíz "gradle-lint-plugin"a "nebula-lint-plugin". También han agregado compatibilidad con Android a la dependencia no utilizada .


En mayo de 2016, Gradle implementó el complemento Gradle lint para encontrar y eliminar dependencias no deseadas

Gradle Lint Plugin: documentación completa

El complemento Gradle Lint es una herramienta de interfaz configurable y conectable para identificar e informar sobre patrones de mal uso o desaprobación en los scripts de Gradle y archivos relacionados.

Este complemento tiene varias reglas. La regla de dependencia no utilizada es una de ellas. Tiene tres características específicas.

  1. Elimina dependencias no utilizadas.
  2. Promueve dependencias transitivas que son utilizadas directamente por su código para explícitas dependencias de primer orden.
  3. Reubica dependencias a la configuración 'correcta'.

Para aplicar la regla, agregue:

gradleLint.rules += 'unused-dependency'

Los detalles de la regla de dependencia no utilizada se dan en la última parte.

Para aplicar el complemento Gradle lint:

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

Alternativamente:

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

apply plugin: 'nebula.lint'

Defina contra qué reglas le gustaría usar pelusa:

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

Para una compilación empresarial, recomendamos definir las reglas de pelusa en un script init.gradle o en un script Gradle que se incluye a través del mecanismo de aplicación Gradle.

Para proyectos multimódulo, recomendamos aplicar el complemento en un allprojectsbloque:

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


Los detalles de la regla de dependencia no utilizada se dan en esta parte

Para aplicar la regla, agregue:

gradleLint.rules += 'unused-dependency'

La regla inspecciona los archivos binarios compilados que emanan de los conjuntos fuente de su proyecto en busca de referencias de clase y hace coincidir esas referencias con las dependencias que ha declarado en su bloque de dependencias .

Específicamente, la regla realiza los siguientes ajustes a las dependencias:

1. Elimina dependencias no utilizadas

  • Los frascos de estilo familiar como com.amazonaws: aws-java-sdk se eliminan, ya que no contienen ningún código

2. Promueve dependencias transitivas que son utilizadas directamente por su código para dependencias explícitas de primer orden

  • Esto tiene el efecto secundario de dividir archivos JAR de estilo familiar, como com.amazonaws: aws-java-sdk, en las partes que realmente está usando, y agregarlas como dependencias de primer orden

3. Reubica las dependencias a la configuración 'correcta'

  • Los webjars se mueven a la configuración de tiempo de ejecución
  • Los archivos JAR que no contienen ninguna clase y contenido fuera de META-INF se mueven al tiempo de ejecución
  • 'xerces', 'xercesImpl', 'xml-apis' siempre deben tener un alcance de tiempo de ejecución
  • Los proveedores de servicios (archivos JAR que contienen META-INF / servicios) como mysql-connector-java se mueven al tiempo de ejecución si no hay ninguna referencia de tiempo de compilación comprobable
  • Las dependencias se mueven a la configuración de conjunto de origen más alta posible. Por ejemplo, 'junit' se reubica en testCompile a menos que exista una dependencia explícita en el conjunto de fuentes principal (raro).


ACTUALIZACIÓN: complementos anteriores

Para su amable información, quiero compartir sobre complementos anteriores

  1. El complemento Gradle que encuentra dependencias no utilizadas, declaradas y transitivas es com.github.nullstress.dependency-analysis

Pero su última versión 1.0.3 se creó el 23 de diciembre de 2014 . Después de eso no hay actualizaciones.

NB: Muchos de nuestros ingenieros están confundidos acerca de este complemento ya que actualizaron solo el número de versión, nada más.

Andante del cielo
fuente
¿Gradle-lint-plugin es compatible con Android?
Jaythaking
@Jaythaking sí. Puede ir a través de este enlace: tools.android.com/tech-docs/new-build-system/… . Espero que te aclare.
SkyWalker
@Jaythaking - acabo de agregar soporte experimental para las dependencias no utilizadas de Android hoy con la versión 4.0.0
jkschneider
44
Lamentablemente, este complemento no funciona con el Kotlin DSL. No tienen planes de apoyarlo.
snowe 01 de
3
Tampoco funciona con las nuevas configuraciones Gradle (por ejemplo: implementatione api), y peor aún, recomienda el cambio de los nuevos a los viejos en desuso (por ejemplo: compile, testCompile, etc.).
Laurence Gonsalves
8

El proyecto mencionado en las respuestas anteriores parece estar muerto. Yo uso gradle-dependency-analyse . La configuración es simple:

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

apply plugin: 'ca.cutterslade.analyze'

Entonces hazlo:

$ gradle analyzeDependencies
Subhash Chandran
fuente
44
Me enfrento a este error: 'Falló la sincronización de Gradle: no se encontró la tarea con el nombre' clases 'en el proyecto'
Pawan
Obtengo stackOverflowException haciendo eso. Sin embargo, no hay información precisa sobre lo que está causando esto. Creo que podría haber un problema de dependencia circular aquí, pero sería una gran idea que la herramienta me dijera dónde.
SGal
1
@Pawan este complemento no funciona con proyectos de Android, y esto no va a cambiar en el corto plazo. Prueba: github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat
8

He tenido mucha suerte con el complemento de análisis de dependencia de Gradle . Para comenzar, agregue las siguientes dos cosas a su script de compilación de Gradle.

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

y

apply plugin: "dependencyAnalysis"

Una vez que estén en su lugar, corre gradle analyze. Si hay dependencias no utilizadas, obtendrá un error de compilación que muestra una salida similar al texto a continuación, además de una lista de las dependencias no utilizadas (declaradas y transitivas). El error de compilación es realmente útil si desea exigir que no haya dependencias no utilizadas a través de una compilación de 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
fuente
3
Me aparece "Error de ejecución para la tarea ': aplicación: analizar'.> El proyecto no tiene el complemento de Java aplicado". Si agrego "apply plugin: 'java'", me dicen que no es compatible con el complemento de aplicación de Android existente. ¿algunas ideas?
Alex Black
Parece que es algo específico con el complemento de aplicación de Android. ¡Ojalá pudiera ayudar, pero no tengo experiencia con Android!
jstricker
El complemento tiene errores, como por ejemplo cuando tiene una llamada estática a una dependencia, que no se tiene en cuenta.
ToYonos
esto parece estar en desuso para el complemento linter
Ruthi Ruth
0

Nota del editor: esta respuesta no está actualizada. Por favor vea la respuesta superior .

Puede probar el complemento Gradle com.github.nullstress.dependency-analysis

Fragmento de script de compilación para usar en todas las versiones de Gradle:

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

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

Cree un fragmento de secuencia de comandos para el nuevo mecanismo de plugin de incubación introducido en Gradle 2.1:

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

Además, hay un hilo ( ¿Hay un equivalente de Gradle de "dependencia mvn: analizar"? ) En el foro de Gradle sobre esto.

EFernandes
fuente
Este complemento parece ser un proyecto muerto ... al menos con la versión actual de Gradle.
cjstehno
0

Los proyectos en la mayoría de las respuestas históricas están muertos, pero el análisis de dependencia de Gradle parece estar vivo a partir del 30/05/2016.

Brandon McKenzie
fuente
Los veo haciendo cambios a la pelusa nebulosa hace un par de semanas.
Construido en Parris el