将插件中的 SourceSet 定义从 Groovy DSL 转换为 Kotlin DSL

Converting SourceSet definition in plugin from Groovy DSL to Kotlin DSL

我的 Gradle 插件中有一个方法可以声明一个新的“scratch”源集。我正在尝试将此方法从 Groovy 转换为 Kotlin,但我无法弄清楚我打算如何使用 Kotlin 声明新的 SourceSet

class JavaConventionsPlugin : Plugin<Project> {
    // ...
    def scratchConfiguration(project) {
        project.sourceSets {
            scratch {
            }
        }

        project.configurations {
            // make scratch configurations include all normal dependencies automatically
            scratchCompile.extendsFrom mainCompile
            scratchRuntime.extendsFrom mainRuntime
            scratchCompileOnly.extendsFrom compileOnly
            scratchImplementation.extendsFrom implementation
            scratchRuntimeOnly.extendsFrom runtimeOnly
        }

        project.dependencies {
            // add dependency on main java code from scratch java code
            scratchImplementation project.extensions.getByType(JavaPluginExtension).sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).output
        }
    }
}

在转换后的 scratchConfiguration 方法中,所有这些似乎都是未解析的引用:

那么新的 SourceSet 声明应该是什么样的?

它们尚未解决,因为您正在从弱 typed/dynamic 语言 (Groovy) 转移到强类型语言 (Kotlin)。 Gradle 的核心是用普通的 Java 编写的。因此,您需要使用 Java API 而不是 Groovy DSL 提供的语法糖。

您上面的代码段或多或少会转换为以下内容:

import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.SourceSetContainer

class ScratchGradlePlugin: Plugin<Project> {

    override fun apply(project: Project) {
        val sourceSets = project.extensions.getByType(SourceSetContainer::class.java)
        val main = sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME)

        sourceSets.register("scratch") {
            it.compileClasspath.plus(main.get().output)
            it.runtimeClasspath.plus(main.get().output)
        }

        val configurations = project.configurations
        
        configurations.named("scratchImplementation") {
            it.extendsFrom(configurations.named(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME).get())
        }

        configurations.named("scratchRuntimeOnly") {
            it.extendsFrom(configurations.named(JavaPlugin.RUNTIME_ONLY_CONFIGURATION_NAME).get())
        }
        
    }

}

我省略了您代码段中的 project.dependencies {} 部分,因为上面的示例 scratchmain 扩展而来,这是您的主要 Java 代码。

参考:https://docs.gradle.org/current/userguide/java_gradle_plugin.html#java_gradle_plugin