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

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

启用后 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): None of the following functions can be called with the arguments supplied:
public abstract fun register(p0: String, p1: Class, vararg p2: Any!): TaskProvider defined in org.gradle.api.tasks.TaskContainer
public abstract fun register(p0: String, p1: Class, p2: Action): TaskProvider defined in org.gradle.api.tasks.TaskContainer
e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt: (12, 22): Unresolved reference: commandLine
e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/verafin/aws/lambda/AbstractLambdaPlugin.kt: (76, 53): None of the following functions can be called with the arguments supplied:
public abstract fun register(p0: String, p1: Class, vararg p2: Any!): TaskProvider defined in org.gradle.api.tasks.TaskContainer
public abstract fun register(p0: String, p1: Class, p2: Action): TaskProvider defined in org.gradle.api.tasks.TaskContainer



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

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

最佳答案

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

关于kotlin - 如何在插件中使用 Gradle Kotlin DSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54725766/

相关文章:

Android Studio 将 Java 转换为 Kotlin 错误无法推断此参数的类型。请明确指定

constructor - 是否保证构造函数内的调用顺序

gradle - 试图了解最简单的Gradle插件

gradle - Groovy覆盖默认调用方法

android - 不兼容的gradle插件

kotlin - Kotlin中折叠和减少之间的区别,何时使用?

android - android-如何访问模型类 MVVM 中的上下文或共享首选项

lambda - Kotlin lambda 中的 vararg 参数

java - 如何将我的 Gradle 插件中的任务执行链接到另一个插件的输出文件?

gradle - 无法在gradle中使用flyway插件执行SQL文件