Pregunta Configuración condicional personalizada para el proyecto Gradle


Tener un extracto de https://github.com/gradle/gradle/blob/master/build.gradle:

ext {
  isDevBuild = {
    gradle.taskGraph.hasTask(developerBuild)
  }
}

task developerBuild {
  description = 'Builds distributions and runs pre-checkin checks'
  group = 'build'
  dependsOn testedDists
}

Cuando utilicé este enfoque para crear una configuración personalizada en mi proyecto, descubrí que:

isDevBuild === true

es decir, siempre es cierto porque la tarea 'developerBuild' está dentro de mi proyecto build.gradle, y por lo tanto en el gráfico. Tienen un par de configuraciones "diferentes" (esCIBuild, isCommitBuild, isFinalReleaseBuild, ...) así que supongo que tengo algo mal aquí.

¿Alguien puede explicar cómo hacer que esta configuración sea condicional en función de algún parámetro externo?


14
2018-05-11 16:08


origen


Respuestas:


taskGraph.hasTask() dice si una tarea está en la tarea ejecución gráfico, es decir si se ejecutará. Debido a que el gráfico de ejecución de tareas solo se crea después de la fase de configuración, este método debe llamarse desde un whenReady devolución de llamada (o en la fase de ejecución):

gradle.taskGraph.whenReady { graph ->
    if (graph.hasTask(developerBuild)) { 
        // do conditional configuration
    }
} 

Para hacer esto más legible, podemos introducir un nuevo método:

def onlyFor(task, config) {
    gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(task)) { 
            project.configure(project, config)
        }
    }
}

Ahora podemos escribir:

onlyFor(developerBuild) { ... }
onlyFor(ciBuild) { ... } 

Otra forma más simple de resolver este problema es verificar si un nombre de tarea particular está contenido en gradle.startParameter.taskNames. Sin embargo, esto tiene dos limitaciones: en primer lugar, compara la tarea nombres, lo que puede marcar la diferencia en las compilaciones de proyectos múltiples. En segundo lugar, solo encontrará las tareas que se hayan especificado directamente (por ejemplo, en la línea de comandos), pero no las dependencias de las mismas.

PD .: en tu código, isDevBuild siempre se sostiene porque un cierre (no nulo) es true de acuerdo con la verdad Groovy. (En contraste con isDevBuild(), isDevBuild no llamará al cierre.)


36
2018-05-11 17:20