我正在编写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):不能调用以下功能附带提供的参数:
中定义的TaskProvider
公共抽象有趣的寄存器(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
完整的可运行项目位于: https://github.com/AlainODea/gradle-com.example.hello-plugin
如何在插件中使用Gradle Kotlin DSL?
答案 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!"
)
}
}
}
}