Cómo pasar una cadena @Input en una tarea en buildSrc.
Este plugin personalizado existe en buildSrc/
de Gradle:
abstract class MyTask : DefaultTask() {
@get:Input
abstract val buildDir: Property<string>
@TaskAction
fun someTask() {
// hacer cosas
}
}
class DevelopmentPlugin : Plugin<project> {
override fun apply(project: Project) {
project.tasks.run {
register("myTask", MyTask::class.java) {
inputs.property("buildDir", project.buildDir)
println(inputs.getProperties())
}
}
}
}
y al ejecutar la tarea con, por ejemplo, $ ./gradlew myTask
, falla con:
Could not determine the dependencies of task ':myTask'.
> Cannot query the value of task ':myTask' property 'rootDir' because it has no value available.
Además, la impresión en pantalla muestra {buildDir=null}
, lo que significa que inputs.property("buildDir", project.buildDir)
ha fallado.
¿Cómo pasar el valor project.buildDir
desde el Plugin hasta la tarea?
No es aceptable utilizar project.buildDir
directamente desde dentro de la tarea debido a la funcionalidad de caché de construcción de Gradle en incubación.
davy.ai
El problema con el código anterior es que la propiedad
buildDir
está definida comoProperty<string>
en lugar de ser unString
regular. Para pasar el valor deproject.buildDir
a la tarea, necesitamos utilizar unProvider<string>
en su lugar.Para solucionar el problema, necesitamos modificar la clase
MyTask
para utilizar unProvider<string>
para la propiedadbuildDir
:y luego actualizar el plugin para establecer el valor de
buildDir
utilizando unProvider<string>
que recupera el valor deproject.buildDir
:Al utilizar un
Provider<string>
para la propiedadbuildDir
y recuperar el valor deproject.buildDir
a través del proveedor, nos aseguramos de que la funcionalidad de la caché de compilación de Gradle funcione correctamente.