MST
星途 面试题库

面试题:Kotlin的Gradle插件开发 - 任务依赖与生命周期管理

假设你正在使用Kotlin开发一个Gradle插件,其中有多个自定义任务,任务A需要在任务B完成后执行,并且任务B在执行前需要进行一些初始化操作,如何通过代码实现这种任务依赖和生命周期管理?请详细说明关键步骤及代码实现。
12.2万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 关键步骤
    • 在Gradle插件的build.gradle.kts文件中配置依赖。
    • 定义任务B及其初始化操作。
    • 定义任务A,并设置任务A依赖于任务B。
  2. 代码实现
    • 配置依赖: 在build.gradle.kts中添加Kotlin DSL和Gradle API依赖:
plugins {
    `kotlin-dsl`
}

repositories {
    gradlePluginPortal()
    mavenCentral()
}

dependencies {
    implementation(gradleApi())
    implementation(kotlin("stdlib-jdk8"))
}
  • 定义任务B及其初始化操作
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

open class TaskB : DefaultTask() {
    init {
        // 初始化操作
        println("TaskB初始化操作")
    }

    @TaskAction
    fun executeTaskB() {
        println("执行TaskB")
    }
}
  • 定义任务A并设置依赖
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

open class TaskA : DefaultTask() {
    init {
        // 任务A的初始化操作(如果有)
        println("TaskA初始化操作")
    }

    @TaskAction
    fun executeTaskA() {
        println("执行TaskA")
    }
}

// 在插件的主类中设置任务依赖
class MyPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        val taskB = target.tasks.register("taskB", TaskB::class.java)
        val taskA = target.tasks.register("taskA", TaskA::class.java) {
            dependsOn(taskB)
        }
    }
}

在上述代码中,首先在build.gradle.kts配置了Gradle插件开发所需的依赖。然后定义了TaskB类,在其init块中进行初始化操作,@TaskAction注解标记的方法为任务执行的实际逻辑。TaskA类同理,最后在插件主类MyPlugin中,通过dependsOn方法设置taskA依赖于taskB,从而实现了任务依赖和生命周期管理。