0

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

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方法中,所有这些似乎都是未解析的引用:

  • sourceSets
  • project.sourceSets
  • java.sourceSets

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

4

1 回答 1

1

它们未解决是因为您正在从弱类型/动态语言 (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 {}代码片段中的部分,因为上面的示例scratch扩展了main您的主要 Java 代码。

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

于 2021-12-07T04:11:08.767 回答