首页 > 解决方案 > Kotlin Gradle 插件:如何访问 `Project` 扩展,例如`sourceSets`?

问题描述

在常规构建脚本中,您可以轻松地使用扩展,Project例如:Project.sourceSetsbuild.gradle.kts

sourceSets {
    main {
        ...
    }
}

但是当我在我的buildSrc模块中开发 Gradle 插件时,我无法访问这些。例如:

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.*

class ExamplePlugin : Plugin<Project> {
    override fun apply(target: Project) {
        target.sourceSets { // error because `sourceSets` can't be resolved.
        }
    }
}

尽管将kotlin-gradle-plugin模块包含在我的buildSrc依赖项中,但仍会发生这种情况:

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31")
}

那么,如何从我的 Gradle 插件中访问这些扩展?

标签: javakotlingradlegradle-plugingradle-kotlin-dsl

解决方案


class ExamplePlugin : Plugin<Project> {
    override fun apply(target: Project) {
        target.configure<JavaPluginExtension> {
            sourceSets {
                println(names)
            }
        }
    }
}

在此处查看附加说明:https ://docs.gradle.org/current/userguide/kotlin_dsl.html#project_extensions_and_conventions

基本上对于插件,或者在不知道所应用插件的其他时间,其他插件添加的扩展的访问器(sourceSets,configurations等)将需要通过方法调用来“检索”该范围或对象。在链接的下方还有一个如何获取其他插件创建的任务的示例:

val test by target.tasks.existing(Test::class)
test.configure { useJUnitPlatform() }
// or
val test by target.tasks.existing(Test::class) { 
    useJUnitPlatform()
}

请注意,如果项目中不存在“sourceSet”对象(因为未应用 java 插件),则会抛出异常。使用 gradle 7.2 版、kotlin-dsl 2.1.6 版测试


推荐阅读