Как использовать Gradle Kotlin DSL внутри плагина? - PullRequest
0 голосов
/ 16 февраля 2019

Я создаю плагин Gradle.

Я пишу такой код, вызывающий 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!"
                )
            }
        }
    }
}

Я бы предпочел написать такой код:

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!"
                )
            }
        }
    }
}

После включения плагина kotlin-dsl в build.gradle.kts Я получаю ошибки компилятора в исходном неизменном HelloPlugin.kt :

e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt: (11, 27): нетследующие аргументы могут быть вызваны с предоставленными аргументами:
открытый абстрактный забавный регистр (p0: String, p1: Class, vararg p2: Any!): TaskProvider, определенный в org.gradle.api.tasks.TaskContainer
publicрегистр абстрактного веселья (p0: String, p1: Class, p2: Action): TaskProvider, определенный в org.gradle.api.tasks.TaskContainer
e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt: (12, 22): неразрешенная ссылка: commandLine
e: / home / example / Documents / gradle-com.example.hello-plugin / src / main / kotlin / com / verafin / aws / lambda / AbstractLambdaPlugin.kt: (76, 53): ни одна из следующих функций не может быть вызвана с предоставленными аргументами:
открытый регистр абстрактного веселья (p0: String, p1: Class, vararg p2: Any!): TaskProvider определен в org.gradle.api.tasks.TaskContainer
открытый регистр абстрактного веселья (p0: String, p1: Class,p2: Action): TaskProvider определен в org.gradle.api.tasks.TaskContainer

Полный исполняемый проект находится по адресу: https://github.com/AlainODea/gradle-com.example.hello-plugin

Как использовать Gradle Kotlin DSL внутриплагин?

1 Ответ

0 голосов
/ 16 февраля 2019

В build.gradle.kts Gradle Kotlin DSL загружается с плагином.В классах Kotlin в вашей реализации плагина вам необходимо явно импортировать Gradle Kotlin DSL:

import org.gradle.kotlin.dsl.*

Вот полный рабочий пример класса Kotlin плагина Gradle с использованием 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!"
                )
            }
        }
    }
}

С помощью 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 {
            tasks.register<Exec>("hello") {
                commandLine = listOf(
                    "echo",
                    "Hello, world!"
                )
            }
        }
    }
}
...