Usando gradle para encontrar a árvore de dependência

542

É possível usar gradle para produzir uma árvore do que depende de quê?

Eu tenho um projeto e gostaria de descobrir todas as dependências para poder podá-lo um pouco com declarações avançadas etc.

user3286701
fonte
4
possível duplicata do que é o comando gradle artfact dependency graph?
Oliver Charlesworth
@OliverCharlesworth use o botão Fechar para marcar a resposta como uma duplicata
030
1
@ user3286701 talvez você possa aceitar uma das respostas?
030
5
gradle dependenciesDeveria trabalhar. É louco como todo mundo tem gradlew app:dependenciesprovavelmente porque Android.
prayagupd
2
@prayagupd Essa deve ser a resposta. A questão é sobre gradle. Depois de ler as respostas altamente classificadas, abri o terminal e coloquei o CD no diretório de um projeto geral que usa gradle. Executei o 'app gradle: dependencies' e recebi o erro 'Falha na compilação', embora não planejasse criar nada. Meu projeto é bom e eu só queria ver as dependências.
ka3ak 13/01

Respostas:

604

Para Android, use esta linha

 gradle app:dependencies

ou se você tiver um invólucro gradle:

./gradlew app:dependencies

Onde appestá o seu módulo de projeto.

Além disso, se você quiser verificar se algo é compilevs. testCompilevs androidTestCompiledependência, bem como o que está puxando isso:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
Chad Bingham
fonte
10
Ah, eu tive que colocar o nome do módulo lá. É por isso que ... Obrigado!
Jenix
Apenas comecei a estudar gradle agora, um pouco confuso. Posso tratar gradlew como gradle, quero dizer, posso inserir as mesmas opções / comandos que o gradlew com gradlew?
Jenix
1
@Jenix sim, se você estiver usando um invólucro apenas usar ./gradlewno lugar degradle
Chad Bingham
2
Eu recebo o erro Project 'app' not found in root projectao executar esses comandos. A solução de Benjamins, no entanto, funcionou.
krock
5
De fato ./gradlew :dependenciesvai funcionar. Ele listará as dependências para todos os seus projetos, mas é fácil encontrar a correta.
dirkjot
240

Você pode tornar a árvore de dependência com o comando gradle dependencies. Para obter mais informações, consulte a seção 11.6.4 Listando dependências do projeto no guia do usuário on-line.

Benjamin Muschko
fonte
2
Quando faço isso com meu projeto Android, tudo o que recebo é esta saída: pastebin.com/fHFigAuY Sugestões?
Nilzor
3
@ Nilzor Você provavelmente está executando o comando no diretório errado (que não contém o build.gradlearquivo) ou o seu arquivo de construção não aplica nenhum plug-in.
Benjamin Muschko
6
você pode obter dependências para um projeto específico usando gradle: project: dependencies
mbonnin
2
Android Studio Plugin - Gradle View para analisar dependências.
precisa
3
Se você usar o wrapper:./gradlew dependencies
ScrappyDev 13/05/19
152

Se você achar difícil navegar pela saída do console gradle dependencies, poderá adicionar o plug - in de relatórios do projeto :

apply plugin: 'project-report'

E gere um relatório HTML usando:

$ ./gradlew htmlDependencyReport

O relatório normalmente pode ser encontrado em build/reports/project/dependencies/index.html

Se parece com isso: insira a descrição da imagem aqui

Devstr
fonte
2
Para mim, foi apenas:gradle htmlDependencyReport
Richard Tingle
2
Isso não funciona para projetos de múltiplos módulos. Acabei de ver e lista vazia.
Adam Arold
1
Ótima descoberta. Plugin realmente faz muito mais docs.gradle.org/current/userguide/project_report_plugin.html
Rux
78

No Android Studio (pelo menos desde a v2.3.3), você pode executar o comando diretamente da interface do usuário:

Clique na guia Gradle e clique duas vezes em : yourmodule -> Tasks -> android -> androidDependencies

A árvore será exibida na guia Gradle Console

Uma imagem vale mais que mil palavras

Nicolás Carrasco
fonte
1
como obtenho a visualização "projetos de classificação"?
user3526
1
@ user3526 clique na etiqueta "gradle" encontrada no lado direito da tela. Veja a imagem em anexo para referência
Nicolás Carrasco
2
Descobri que isso cria uma lista simples no AS 3.2.0, em vez de uma árvore. A variante da linha de comando cria uma árvore, no entanto.
Tom
5
@ Execute a tarefa 'depencies' na categoria 'help' e não 'android'. Ele mostra como a árvore
Maxim Berezovsky
27

Geralmente, o gráfico completo test, compilee de androidTestCompiledependência é demais para examinar juntos. Se você deseja apenas o compilegráfico de dependência, pode usar:

./gradlew app:dependencies --configuration compile

Fonte: Seção 4.7.6 da Gradle docs

Nota: compilefoi descontinuado nas versões mais recentes do Gradle e nas versões mais recentes você deve mudar todas as suas compiledependências implementation. Por favor, veja esta resposta aqui

David Rawson
fonte
4
apenas uma nota: compilação foi preterido, as pessoas devem agora passar para implementação
reinaldomoreira
25

Se você deseja visualizar suas dependências em um gráfico, pode usar o plug-in gradle-dependency-graph-generator .

Geralmente, a saída desse plugin pode ser encontrada no diretório build / reports / dependency-graph e contém três arquivos (.dot | .png | .svg) se você estiver usando a versão 0.5.0 do plugin.

Exemplo de gráfico de dependências em um aplicativo real ( Chess Clock ):

gráfico

David Miguel
fonte
Ei David, eu fiz como foi dito nas instruções do plugin. Apliquei o plug-in no projeto gradle, mas não estou vendo nenhuma pasta de relatórios no diretório build. Há algo que precisamos fazer além de criar e executar o projeto?
Rushi M Thakker 04/02/19
Este plugin não mostra versão de dependência e conflitos. assim para Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Este torná-lo inútil ..
sytolk
18

Para Android, digite isso no terminal

gradlew app:dependencies

Ele listará todas as dependências e aquelas com versões mais recentes para você atualizar como

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)
Remy
fonte
15

As coisas avançaram em Gradle, por isso acredito que essa pergunta merece outra resposta.
Desde o Gradle 4.3, " varreduras de construção " foram introduzidas. Todas as informações relevantes estão disponíveis nos documentos Gradle ( 1 , 2 ). Para mim, agora parece ser a maneira mais fácil de verificar suas dependências (e geralmente sua compilação) de uma maneira clara e organizada.

Eles são muito fáceis de criar, basta executar:

gradle build --scan  

(ou ./gradlew build --scanse você usar um invólucro)

Isso produz um link gerado aleatoriamente onde você pode ver sua verificação. Ao abrir esse link, você digita seu e-mail e obtém controle total do link: por exemplo. compartilhe ou exclua. Ele tem muitas informações sobre sua compilação , não apenas dependências. Você pode ver suas dependências, suas hierarquias, o repositório usado para obtê-las, mas também muitas outras coisas sobre sua compilação, a saber, seu desempenho (que é de interesse em grandes compilações complexas), seus testes, até a saída do console e sua configuração do sistema, que JDK e JVM foram usadas, tamanho máximo de heap etc.

Esta é uma tela de impressão de um projeto simulado:

Construir exemplo de verificação

Uma verificação de compilação é um registro compartilhável de uma compilação que fornece informações sobre o que aconteceu e por quê. Você pode criar uma varredura de compilação em scans.gradle.com gratuitamente.

Observe, no entanto, que as informações do seu processo de compilação serão enviadas aos servidores Gradle. Você tem controle total para excluí-lo quando terminar sua inspeção.

Finalmente, você também pode usar as varreduras de compilação nas versões Gradle anteriores à 4.3, basta adicionar manualmente o plug-in de varreduras no buildscript.

Editar :
Incorporando alguns comentários dos comentários, algumas notas extras:
1) É muito difícil fazer isso por engano ou sem entender que algumas informações de sua compilação estarão on-line (privadas para você, com a capacidade de excluí-las, mas ainda on-line). )

Ao executar gradle build --scana seguinte mensagem aparece:

Publishing a build scan to scans.gradle.com requires accepting the Gradle
Terms of Service defined at https://gradle.com/terms-of-service. Do you
accept these terms? [yes, no]

Você precisa escrever explicitamente yese a mensagem continua:

Publishing build scan...  
https://gradle.com/s/a12en0dasdu

2) No Gradle Enterprise, você pode hospedar varreduras do gradle build em seus próprios servidores. No entanto, não tenho experiência nisso e minha abordagem proposta foi sobre a distribuição padrão da Gradle, usando os servidores da Gradle para suas varreduras de compilação.

3) O próprio Gradle promove as varreduras de compilação como a maneira de lidar com a maioria dos seus problemas de compilação.

tryman
fonte
11
Lamento diminuir a votação, mas a IMO não está respondendo à pergunta e não está avisando com clareza suficiente para que gradle build --scanvocê publique detalhes de sua compilação em algum lugar da Internet - e para excluí-la, você deve associá-la ao endereço de email de trabalho.
Michal
1
Hey Michal, você pode votar se você se sentir assim. No entanto, eu tenho que perguntar, você tentou? Ao executar gradle build --scanno cmd, você será solicitado: Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]. Você precisa escrever manualmente yes. Logo depois, você recebe a mensagem: Publishing build scan... https://gradle.com/s/a12en0dasdu(coloque o link do mesmo tipo aleatoriamente). Então, acredito que isso o avise adequadamente antes. (1/2)
tryman
1
Você pode acessar o link e excluir a verificação imediatamente, sem um email ou qualquer coisa. Como resposta, acredito que responde à pergunta . Na verdade, ele mostra informações extras sobre suas dependências (e além do limite: informações adicionais para toda a compilação) em comparação com outras abordagens. Se você não acha que está totalmente bem, mas é (até onde eu sei) a ferramenta mais abrangente no momento para o trabalho, é importante ter isso em mente. Por fim, é promovido pelo próprio Gradle, é literalmente o primeiro guia deles (2/2) #
2137
@ Michael Desculpe, esqueci de marcar você antes, então você pode não ter visto meus comentários. (Também editei o post para incorporar os comentários com os quais respondi.) #
Tryman
2
Eu não tentei isso - obrigado por esclarecer sobre a aceitação dos termos. Eu removi meu -1.
Michal
9

No Android Studio

1) Abra o terminal e verifique se você está na pasta raiz do projeto.

2) Execute ./gradlew app:dependencies (se não estiver usando o wrapper gradle, tente gradle app:dependencies)

Observe que a execução ./gradle dependenciesfornecerá apenas uma árvore de dependência da pasta raiz do projeto, portanto, mencionar o aplicativo da maneira acima, ou seja, ./gradlew app:dependenciesé importante.

Shailesh Mamgain
fonte
1
para mim, funcionou sem o "./", assim: gradlew app: dependencies.
Gilad Levinson
7

Eu também achei útil para executar isso:

./gradlew dI --dependency <your library>

Isso mostra como as dependências estão sendo resolvidas ( dependencyInsight) e ajuda você a depurar para onde você precisa forçar ou excluir as bibliotecas em seubuild.gradle

Consulte: https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html

Christian Vielma
fonte
i tentar este como você diz, mas é fez não trabalho :( stackoverflow.com/questions/49646103/...
loki
7

Observe que você pode precisar fazer algo como ./gradlew <module_directory>:<module_name>:dependenciesse o módulo tiver um diretório extra antes de atingir seu build.gradle. Em caso de dúvida, ./gradlew tasks --allverifique o nome.

Fruta
fonte
7

Para mim, era simplesmente um comando

no build.gradle add plugin

apply plugin: 'project-report'

e então vá para o cmd e execute o seguinte comando

./gradlew htmlDependencyReport

Isso me dá um relatório HTML WOW Html report 💕

Isso é todo meu senhor.

Dupinder Singh
fonte
Isso já foi respondido por Devstr.
brute_force 10/04
Sim, obrigado @brute_force Naquela época, não estava visível para mim. O que você quer, remova minha resposta?
Dupinder Singh 10/04
1

Para versões recentes do Gradle (testei com a versão 6.4.1):

gradle dependencies --configuration compileClasspath

ou se você estiver usando o Gradle Wrapper:

gradlew dependencies --configuration compileClasspath
Soufiane Sakhi
fonte
0

Se você deseja todas as dependências em um único arquivo no final, em duas etapas. Adicione isso ao seu build.gradle.ktsna raiz do seu projeto:

project.rootProject.allprojects {
    apply(plugin="project-report")

    this.task("allDependencies", DependencyReportTask::class) {
        evaluationDependsOnChildren()
        this.setRenderer(AsciiDependencyReportRenderer())
    }

}

Aplique então:

./gradlew allDependencies | grep '\-\-\-' | grep -Po '\w+.*$' | awk -F ' ' '{ print $1 }' | sort | grep -v '\{' | grep -v '\[' | uniq | grep '.\+:.\+:.\+'

Isso fornecerá todas as dependências do seu projeto e subprojetos, além de todas as dependências de terceiros.

Se você deseja fazer isso de maneira programática, precisará de um representante personalizado das dependências - você pode começar estendendo o AsciiDependencyReportRendererque imprime um gráfico ascii das dependências por padrão.

codeWhisperer
fonte