将插件中的 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
方法中,所有这些似乎都是未解析的引用:
sourceSets
project.sourceSets
java.sourceSets
那么新的 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 {}
部分,因为上面的示例 scratch
从 main
扩展而来,这是您的主要 Java 代码。
参考:https://docs.gradle.org/current/userguide/java_gradle_plugin.html#java_gradle_plugin
我的 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
方法中,所有这些似乎都是未解析的引用:
sourceSets
project.sourceSets
java.sourceSets
那么新的 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 {}
部分,因为上面的示例 scratch
从 main
扩展而来,这是您的主要 Java 代码。
参考:https://docs.gradle.org/current/userguide/java_gradle_plugin.html#java_gradle_plugin