自定义配置依赖项声明



我正在尝试将build.gradle转换为kotlin-dsl。使用7.4.1级。声明自定义配置的正确方式是什么。对于像这样的自定义配置


configurations { grafana }

sourceSets { grafana }

并且在依赖块内


grafanaImplementation "org.slf4j:slf4j-simple:1.7.36"
grafanaImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
grafanaRuntimeOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk8"

当我在kotlin dsl时,我正在做


val grafana by configurations.creating

val grafanaSourceSet = sourceSets.create("grafana")

并且在依赖块内

grafana("org.slf4j:slf4j-simple:1.7.36")
grafana("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

当我尝试将grafanaImplementation/grafanaRuntimeOnly放在kotlin dsl中时,它失败了。

在kotlin dsl 中,grafanaImplementation/grafanaRuntimeOnly的等价物是什么

快速修复

当你做

val grafanaSourceSet = sourceSets.create("grafana")

在幕后,Gradle将创建所需的配置,grafanaImplementationgrafanaRuntimeOnly等,因此您可以使用它们而不会出现以下错误:

val grafanaSourceSet = sourceSets.create("grafana")
dependencies {
"grafanaImplementation"("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
"grafanaRuntimeOnly"("org.slf4j:slf4j-simple:1.7.36")
}

这种方法更像Groovy的工作方式——它基本上禁用了类型检查,字符串将在Gradle执行期间进行评估。

生成的DSL访问者

然而,字符串类型并不是我们喜欢Kotlin的原因!我们想要类型安全和自动完成提示。这正是我们在implementation()runtimeOnly()中看到的。那么,我们如何为grafanaImplementation()grafanaRuntimeOnly()获取它们呢?

基本上,Gradle会扫描注册的配置,当它看到插件创建了implementation配置时,它会生成Kotlin DSL访问器。然而,它不能为包含访问者定义的build.gradle.kts生成访问者。。。太晚了。因此,我们需要更早地定义配置。我们可以使用buildSrc插件来实现这一点。

buildSrcGrafana约定插件

  1. 设置buildSrc项目(这在Gradle文档或其他StackOverflow答案中有更多介绍(

  2. 为Grafana-config创建一个预编译的脚本插件

    // $projectRoot/buildSrc/src/main/kotlin/grafana.convention.gradle.kts
    plugins {
    // using 'sourceSets' requires the Java plugin, so we must apply it
    java
    }
    val grafanaSourceSet = sourceSets.create("grafana")
    

    请注意,这个约定插件在应用Java插件时非常固执己见。在更复杂的设置中,你可能希望对Java插件做出反应,而不是总是应用它

  3. 现在应用约定插件,Gradle将生成Kotlin DSL访问器!

    // $projectRoot/build.gradle.kts
    plugins {
    id("grafana.convention")
    }
    dependencies {
    // no string-typing needed!
    grafanaImplementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    grafanaRuntimeOnly("org.slf4j:slf4j-simple:1.7.36")
    }