es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código anterior es que la propiedad buildDir está definida como Property<string> en lugar de ser un String regular. Para pasar el valor de project.buildDir a la tarea, necesitamos utilizar un Provider<string> en su lugar.

    Para solucionar el problema, necesitamos modificar la clase MyTask para utilizar un Provider<string> para la propiedad buildDir:

    abstract class MyTask : DefaultTask() {
    
        @get:Input
        abstract val buildDir: Property<string>
    
        @TaskAction
        fun someTask() {
           // hacer cosas
        }
    }
    

    y luego actualizar el plugin para establecer el valor de buildDir utilizando un Provider<string> que recupera el valor de project.buildDir:

    class DevelopmentPlugin : Plugin<project> {
    
        override fun apply(project: Project) {
            project.tasks.run {
                val buildDirProvider = project.provider { project.buildDir.absolutePath }
    
                register("myTask", MyTask::class.java) {
                    inputs.property("buildDir", buildDirProvider)
    
                    println(inputs.getProperties())
                }
            }
        }
    }
    

    Al utilizar un Provider<string> para la propiedad buildDir y recuperar el valor de project.buildDir a través del proveedor, nos aseguramos de que la funcionalidad de la caché de compilación de Gradle funcione correctamente.

Comments are closed.