logo
Publicado em

Entendendo DAG no Gradle: Grafo Acíclico Direcionado Explicado

Authors

O que é DAG?

DAG significa Directed Acyclic Graph (Grafo Acíclico Direcionado).

No contexto do Gradle, ele representa a estrutura de execução das tarefas (tasks) dentro do build.

  • Directed (Direcionado) → existe uma ordem/dependência entre tarefas
  • Acyclic (Acíclico) → não existem ciclos; uma tarefa não pode depender dela mesma direta ou indiretamente
  • Graph (Grafo) → um conjunto de nós (tasks) conectados por dependências

Como o Gradle usa o DAG?

Quando você executa um comando como:

gradle build

O Gradle:

  1. Analisa todas as tarefas disponíveis
  2. Identifica as dependências entre elas
  3. Monta um DAG
  4. Executa apenas as tarefas necessárias na ordem correta

Exemplo simples

tasks.register('compile') {
    doLast {
        println 'Compilando código...'
    }
}

tasks.register('test') {
    dependsOn 'compile'
    doLast {
        println 'Executando testes...'
    }
}

tasks.register('packageApp') {
    dependsOn 'test'
    doLast {
        println 'Empacotando aplicação...'
    }
}

Estrutura do DAG:

compile → test → packageApp

Benefícios do DAG no Gradle

1. Execução eficiente

O Gradle executa apenas o necessário, evitando retrabalho.

2. Paralelismo

Tarefas independentes podem ser executadas em paralelo.

3. Incremental Build

Se nada mudou, tarefas podem ser puladas automaticamente.

4. Clareza de dependências

Você define explicitamente o fluxo de execução.


Importante: Sem ciclos!

Isso é inválido:

taskA.dependsOn taskB
taskB.dependsOn taskA

Isso criaria um ciclo, o que o Gradle não permite.


DAG na prática (como pensar)

Sempre pense no seu build como um pipeline:

Código → CompilaçãoTestesBuildDeploy

Cada etapa depende da anterior isso é um DAG.


Dica avançada

Use:

gradle tasks
gradle build --dry-run

Para visualizar como o Gradle está organizando o DAG.