Como encontrar / remover dependências não utilizadas no Gradle

128

Eu queria encontrar dependências não utilizadas no meu projeto. Existe um recurso para isso em Gradle, como no Maven?

Alexander Bezrodniy
fonte

Respostas:

72

ATUALIZAÇÃO: 28-06-2016: Suporte do Android à dependência não utilizada

Em junho de 2017 , eles lançaram 4.0.0 version e renomearam o nome do projeto raiz "gradle-lint-plugin"para "nebula-lint-plugin". Eles também adicionaram suporte ao Android à dependência não utilizada .


Em maio de 2016, a Gradle implementou o plugin Gradle lint para encontrar e remover dependências indesejadas

Gradle Lint Plugin: Documentação completa

O plug-in Gradle Lint é uma ferramenta de linter conectável e configurável para identificar e relatar padrões de uso indevido ou obsoleto em scripts Gradle e arquivos relacionados.

Este plugin possui várias regras. A regra de dependência não utilizada é uma delas. Possui três características específicas.

  1. Remove dependências não utilizadas.
  2. Promove dependências transitivas usadas diretamente pelo seu código para dependências explícitas de primeira ordem.
  3. Realoca as dependências para a configuração 'correta'.

Para aplicar a regra, adicione:

gradleLint.rules += 'unused-dependency'

Detalhes da regra de dependência não utilizada são fornecidos na última parte.

Para aplicar o plugin 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 quais regras você gostaria de descartar:

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

Para uma construção corporativa, recomendamos definir as regras do lint em um script init.gradle ou em um script Gradle incluído no mecanismo de aplicação Gradle.

Para projetos de multimódulos, recomendamos a aplicação do plug-in em um allprojectsbloco:

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


Detalhes da regra de dependência não utilizada são fornecidos nesta parte

Para aplicar a regra, adicione:

gradleLint.rules += 'unused-dependency'

A regra inspeciona os binários compilados que emanam dos conjuntos de fontes do seu projeto, procurando referências de classe e as correspondem às dependências que você declarou no seu bloco de dependências .

Especificamente, a regra faz os seguintes ajustes nas dependências:

1. Remove dependências não utilizadas

  • Os frascos de estilo familiar como com.amazonaws: aws-java-sdk são removidos, pois não contêm código

2. Promove dependências transitivas usadas diretamente pelo seu código para dependências explícitas de primeira ordem

  • Isso tem o efeito colateral de dividir arquivos JAR de estilo familiar, como com.amazonaws: aws-java-sdk, nas partes que você está realmente usando e incluí-los como dependências de primeira ordem

3. Realoca as dependências para a configuração 'correta'

  • Webjars são movidos para a configuração de tempo de execução
  • Arquivos JAR que não contêm nenhuma classe e conteúdo fora do META-INF são movidos para o tempo de execução
  • 'xerces', 'xercesImpl', 'xml-apis' devem sempre ter o escopo do tempo de execução
  • Os provedores de serviços (arquivos JAR que contêm META-INF / services) como mysql-connector-java são movidos para o tempo de execução se não houver nenhuma referência provável em tempo de compilação
  • As dependências são movidas para a configuração mais alta possível. Por exemplo, 'junit' é realocado para testCompile, a menos que exista uma dependência explícita dele no conjunto de fontes principal (raro).


ATUALIZAÇÃO: Plugins anteriores

Para sua informação, quero compartilhar sobre plugins anteriores

  1. O plug-in Gradle que encontra dependências não utilizadas, declaradas e transitivas é com.github.nullstress.dependency-analysis

Mas sua versão mais recente 1.0.3 foi criada em 23 de dezembro de 2014 . Depois disso, não há atualizações.

NB: Muitos de nossos engenheiros estão confusos com este plugin , pois atualizam apenas o número da versão, nada mais.

SkyWalker
fonte
O gradle-lint-plugin é compatível com Android?
Jaythaking
@Jaythaking yes. Você pode acessar este link: tools.android.com/tech-docs/new-build-system/… . Espero que isso lhe esclareça.
7266 SkyWalker
@Jaythaking - apenas suporte experimental adicional para Android dependências não usadas hoje com versão 4.0.0
jkschneider
4
Infelizmente, este plugin não funciona com o kotlin dsl. Eles não têm planos para apoiá-lo.
snowe
3
Ele também não funciona com as novas configurações Gradle (por exemplo: implementatione api) e, pior ainda, recomenda a alteração dos novos para os antigos obsoletos (por exemplo: compile, testCompile, etc.).
Laurence Gonsalves
8

O projeto mencionado nas respostas anteriores parece estar morto. Eu uso gradle-dependency-analyse . A instalação é simples:

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

apply plugin: 'ca.cutterslade.analyze'

Então faça:

$ gradle analyzeDependencies
Subhash Chandran
fonte
4
Estou enfrentando este erro: 'Falha na sincronização do gradle: tarefa com o nome' classes 'não encontrada no projeto'
Pawan
Eu recebo stackOverflowException fazendo isso. Não há informações precisas sobre o que está causando isso. Acho que pode haver um problema de dependência circular aqui, mas seria uma ótima idéia que a ferramenta me dissesse onde.
SGAL
1
@Pawan, este plugin não funciona com projetos Android, e isso não vai mudar tão cedo. Prova: github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat:
8

Eu tive muita sorte usando o Plugin de Análise de Dependência Gradle . Para começar, adicione as duas coisas a seguir ao script de construção do Gradle.

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

e

apply plugin: "dependencyAnalysis"

Quando esses estiverem no lugar, corra gradle analyze. Se houver dependências não utilizadas, você receberá uma falha de compilação que mostra uma saída semelhante ao texto abaixo, além de uma lista das dependências não utilizadas (declaradas e transitivas). A falha de compilação é realmente útil se você deseja impor que não deve haver dependências não utilizadas por meio de uma compilação de IC.

: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
fonte
3
Recebo "Falha na execução da tarefa ': app: analyse'.> O projeto não tem o plugin java aplicado." Se eu adicionar "apply plugin: 'java'", será informado que ele não é compatível com o plug-in de aplicativo Android existente. alguma ideia?
Alex Black
Parece que é algo específico com o plug-in de aplicativo Android. Gostaria de poder ajudar, mas não tenho experiência com o Android!
jstricker
O plug-in possui bugs, como, por exemplo, quando você tem uma chamada estática para uma dependência, não levada em consideração.
ToYonos
este parece ser obsoleto para o plugin linter
Ruthi Ruth
0

Nota do Editor: Esta resposta está desatualizada. Por favor, veja a resposta superior .

Você pode experimentar o plug- in Gradle com.github.nullstress.dependency-analysis

Construa o snippet de script para uso em todas as versões do Gradle:

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

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

Crie um snippet de script para o novo mecanismo de plug-in incubado e introduzido no Gradle 2.1:

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

Além disso, há um thread ( existe um equivalente Gradle de "dependência de mvn: analise"? ) No fórum Gradle sobre isso.

EFernandes
fonte
Este plugin parece ser um projeto morto ... pelo menos com a versão atual do Gradle.
precisa saber é o seguinte
0

Os projetos na maioria das respostas históricas estão inoperantes, mas a análise da dependência gradle parece estar viva a partir de 30/05/2016.

Brandon McKenzie
fonte
Eu os vejo fazendo mudanças na nebulosa há algumas semanas.
Construído em Parris