gradle 自定义配置依赖项声明

6za6bjd0  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(155)

我正在尝试将build.gradle转换为Kotlindsl。使用gradle 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放在Kotlindsl中时,它失败了。
在Kotlindsl中,grafanaImplementation/ grafanaRuntimeOnly的等效用法是什么

8ehkhllq

8ehkhllq1#

快速修复

当你这样做

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配置时,它会生成KotlinDSL访问器。但是,它无法为包含访问器定义的build.gradle.kts生成访问器...这已经太晚了。因此,我们需要更早地定义配置。我们可以使用buildSrc插件来实现这一点。

buildSrc图形约定插件

1.设置buildSrc项目(Gradle docsother StackOverflow answers中详细介绍了这一点)
1.为Grafana配置创建预编译脚本插件

// $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插件做出React,而不是总是应用它。
1.现在应用约定插件,Gradle将生成KotlinDSL访问器!

// $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")
}

相关问题