【问题标题】:How do I use the Gradle Kotlin DSL inside a plugin?如何在插件中使用 Gradle Kotlin DSL?
【发布时间】:2019-07-10 13:36:54
【问题描述】:

我正在创作一个 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 中遇到编译器错误:

e: /home/example/Documents/gradle-com.example.hello-plugin/src/main/kotlin/com/example/HelloPlugin.kt: (11, 27): 不能调用以下函数提供的参数:
public abstract fun register(p0: String, p1: Class, vararg p2: Any!): TaskProvider 定义在 org.gradle.api.tasks.TaskContainer
public abstract fun register(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): 以下函数都不能使用提供的参数调用:
public abstract fun register(p0: String, p1: Class, vararg p2: Any!): TaskProvider 定义在 org.gradle.api.tasks.TaskContainer
public abstract fun register(p0: String, p1: Class, p2: Action):在org.gradle.api.tasks.TaskContainer中定义的TaskProvider

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

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

【问题讨论】:

    标签: kotlin gradle-plugin


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多