如何在插件中使用Gradle Kotlin DSL?

时间:2019-02-16 17:27:31

标签: kotlin gradle-plugin

我正在编写Gradle插件。

我正在编写这样的代码,调用Groovy / Java Gradle API:

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

build.gradle.kts 中启用 kotlin-dsl 插件后,我在原来未更改的 HelloPlugin.kt 中收到编译器错误:< / p>

  

e:/home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt:(11,27):不能调用以下功能附带提供的参数:
  公共抽象有趣的寄存器(p0:字符串,p1:类,vararg p2:任何!):在org.gradle.api.tasks.TaskContainer中定义的TaskProvider
  公共抽象有趣的寄存器(p0:字符串,p1:类,p2:操作):在org.gradle.api.tasks.TaskContainer中定义的TaskProvider
  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:字符串,p1:类,vararg p2:任何!):在org.gradle.api.tasks.TaskContainer中定义的TaskProvider
  公共抽象有趣的寄存器(p0:字符串,p1:类,p2:操作):在org.gradle.api.tasks.TaskContainer

中定义的TaskProvider

完整的可运行项目位于: https://github.com/AlainODea/gradle-com.example.hello-plugin

如何在插件中使用Gradle Kotlin DSL?

1 个答案:

答案 0 :(得分:0)

在build.gradle.kts中,Gradle Kotlin DSL随插件一起加载。在插件实现中的Kotlin类中,您需要显式导入Gradle Kotlin DSL:

import org.gradle.kotlin.dsl.*

以下是使用Kotlin Gradle DSL的完整示例Gradle插件Kotlin类:

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