lunes, 11 de marzo de 2019

Como hacer un multi proyecto Gradle

Hoy vamos a hacer un pequeño ejemplo de como configurar un multiproyecto con gradle. Será un ejemplo básico pero donde también indicaremos como configurar los task para que sean utilizables en todos los proyectos.

Nuestro ejemplo se basará en un proyecto padre denominado 'Concesionario' y varios proyectos hijos: 'Bicicleta', 'Coche' y 'Moto'. Estos incluidos como una subcarpeta del primero. Todos con su propio build.gradle menos 'Bicicleta'.

Para empezar debemos crear un fichero 'settings.gradle' dentro de 'Concesionario' donde indicaremos cual es el proyecto padre y que sub-proyectos incluye. A través de este fichero podremos configurar la jerarquia del mismo.

rootProject.name = 'Concesionario'
include 'Bicicleta'
include 'Coche'
include 'Moto'

Bicicleta y Moto no tendran 'build.gradle' propio y los configuraremos a través del propio build.gradle de Concesionario. El proyecto Coche sin embargo contará con su propio fichero 'build.gradle', desde donde podremos configurar las tareas de forma personalizada.

El build.gradle de Concesionario será:

project(':Bicicleta').ext.ventanillas=false
project(':Moto').ext.ventanillas=false
allprojects {
    task descripcion {
        doLast { task ->
            println "Descripcion: $task.project.name"
        }
    }
}
subprojects {
    task puestaAPunto {
        doLast {
            println "1. Revisar ruedas"
        }
    }
    afterEvaluate { Project project ->
            if (project.ventanillas) {
                task revisarVentanas {
                    doLast {
                        println 'Anexo: Revisar ventanillas.'
                    }
                }
            }
        }
}
configure(subprojects.findAll {it.name != 'Bicicleta'}) {
    task arrancar {
        doLast {
            println '1. Conectar llave 2. Arrancar motor'
        }
    }
}
task ('responsable') << {
  println 'Vehiculos a Motor: Daniel'
}
project(':Bicicleta') {
  task responsable.doLast {
    println 'Vehiculos No Motor: Santiago'
  }
}

El build.gradle de Coche será:

ext.ventanillas=true
puestaAPunto {
    doLast {
        println "2. Revisar cinturones seguridad"
    }
}

Dentro de las distintas tareas tenemos 'descripcion' que será una tarea asociada a todos los proyectos y por tanto al ejecutarse con 'gradle -q descripcion' se ejecutará una vez por cada proyecto, obteniendo la siguiente salida:

Descripcion: Concesionario
Descripcion: Bicicleta
Descripcion: Coche
Descripcion: Moto

Si ejecutamos el mismo comando pero dentro de alguno de los proyectos. Solo se ejecutará y por tanto solo se mostrará la tarea y descripción asociada a dicho proyecto.

También tenemos la tarea 'responsable'. Esta tarea solo se ha configurado para el proyecto padre y el proyecto 'Bicicleta'. Por tanto si la ejecutamos dentro de alguno otro proyecto dará error. Si la ejecutamos sobre el proyecto padre, obtendremos la siguiente salida:

Vehiculos a Motor: Daniel
Vehiculos No Motor: Santiago

También tenemos la tarea 'puestaAPunto' que solo estará asociada a los subproyectos. Y además es personalizada para el proyecto 'Coche'. Por tanto al ejecutarla con 'gradle puestaAPunto' mostrará la ejecución para cada proyecto y para el proyecot 'Coche' también la salida de su ejecución personalizada:

> Task :Bicicleta:puestaAPunto
1. Revisar ruedas

> Task :Coche:puestaAPunto
1. Revisar ruedas
2. Revisar cinturones seguridad

> Task :Moto:puestaAPunto
1. Revisar ruedas

Tenemos la tarea 'arrancar' que se encuentra configurada para cada uno de los subproyectos menos el proyecto 'Bicicleta'. Y que al ejecutar con el comando 'gradle arrancar' nos dará la siguiente salida:

> Task :Coche:arrancar
1. Conectar llave 2. Arrancar motor

> Task :Moto:arrancar
1. Conectar llave 2. Arrancar motor

Y por último tenemos la tarea 'revisarVentanas' que solo se ejecutará para aquellos proyectos que tengan las variable 'revisarVentana' a true. Y por tanto la ejecución del comando 'gralde revisarVentanas' devuelve la siguiente salida:

> Task :Coche:revisarVentanas
Anexo: Revisar ventanillas.

Referencia: https://docs.gradle.org/current/userguide/multi_project_builds.html

No hay comentarios:

Publicar un comentario