Estoy creando un complemento de Gradle.
Estoy escribiendo un código como este llamando a las API Groovy/Java Gradle:
package com.example import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.Exec class HelloPlugin : Plugin<Project> { override fun apply(project: Project) { project.afterEvaluate { project.tasks.register("hello", Exec::class.java) { task -> task.commandLine = listOf( "echo", "Hello, world!" ) } } } }
Preferiría escribir un código como este:
package com.example import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.Exec class HelloPlugin : Plugin<Project> { override fun apply(project: Project) { project.afterEvaluate { project.tasks.register<Exec>("hello") { task -> task.commandLine = listOf( "echo", "Hello, world!" ) } } } }
Después de habilitar el complemento kotlin-dsl en build.gradle.kts , recibo errores del compilador en el HelloPlugin.kt original sin cambios:
e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt: (11, 27): ninguna de las siguientes funciones se puede llamar con los argumentos suministrado:
registro divertido público abstracto (p0: Cadena, p1: Clase, vararg p2: ¡Cualquiera!): TaskProvider definido en org.gradle.api.tasks.TaskContainer
registro divertido público abstracto (p0: Cadena, p1: Clase, p2: Acción): TaskProvider definido en org.gradle.api.tasks.TaskContainer
e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt: (12, 22): Referencia no resuelta: commandLine
e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/verafin/aws/lambda/AbstractLambdaPlugin.kt: (76, 53): Ninguna de las siguientes funciones puede ser llamado con los argumentos proporcionados:
registro divertido público abstracto (p0: Cadena, p1: Clase, vararg p2: ¡Cualquiera!): TaskProvider definido en org.gradle.api.tasks.TaskContainer
registro divertido público abstracto (p0: Cadena, p1: Clase, p2: Acción): TaskProvider definido en org.gradle.api.tasks.TaskContainer
El proyecto ejecutable completo está en: https://github.com/AlainODea/gradle-com.example.hello-plugin
¿Cómo uso Gradle Kotlin DSL dentro de un complemento?
En build.gradle.kts, Gradle Kotlin DSL se carga con el complemento. En las clases de Kotlin en la implementación de su complemento, debe importar Gradle Kotlin DSL explícitamente:
import org.gradle.kotlin.dsl.*
Aquí hay un ejemplo de trabajo completo de la clase Kotlin del complemento Gradle que usa Kotlin Gradle DSL:
package com.example import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.Exec import org.gradle.kotlin.dsl.* class HelloPlugin : Plugin<Project> { override fun apply(project: Project) { project.afterEvaluate { project.tasks.register<Exec>("hello") { task -> task.commandLine = listOf( "echo", "Hello, world!" ) } } } }
Con Kotlin Gradle DSL, puede omitir los parámetros de cierre nombrados explícitamente y hacerlo aún más limpio:
package com.example import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.Exec import org.gradle.kotlin.dsl.* class HelloPlugin : Plugin<Project> { override fun apply(project: Project) { project.afterEvaluate { tasks.register<Exec>("hello") { commandLine = listOf( "echo", "Hello, world!" ) } } } }