如何使用 Gradle Kotlin DSL 为所有 Gradle 子项目定义变量

Phi*_*ppe 24 gradle kotlin gradle-kotlin-dsl

我正在遵循指南。

该指南写道:项目的额外属性可以从其子项目中看到。这似乎对我不起作用,因为以下内容不起作用:

build.gradle.kts我有:

val ktorVersion by extra("1.3.2")
Run Code Online (Sandbox Code Playgroud)

subproject/build.gradle.kts我有:

dependencies {
    implementation("io.ktor:ktor-server-core:$ktorVersion")
}
Run Code Online (Sandbox Code Playgroud)

cku*_*der 29

在项目级别build.gradle.kts

val ktorVersion by extra { "1.3.2" }
Run Code Online (Sandbox Code Playgroud)

在里面subproject/build.gradle.kts

val ktorVersion: String by rootProject.extra

dependencies {  
   implementation("io.ktor:ktor-server-core:$ktorVersion")
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息:有关额外属性的 Gradle 文档

  • 我不明白。如果不是这样的话,为什么文档会说:“项目上的额外属性是可见的”? (3认同)

sed*_*vav 13

buildSrc 另外,您可以在项目内的对象中定义版本。buildSrc是 Gradle 中的一个特殊项目,它的所有声明在所有 Gradle 项目中都可见(除了settings.gradle.kts)。所以你可能有

buildSrc/src/main/kotlin/myPackage/Versions.kt

object Versions {
  const val ktorVersion = "1.2.3"
}
Run Code Online (Sandbox Code Playgroud)

然后从任何build.gradle(.kts) 文件中使用它

import myPackage.Versions.ktorVersion

dependencies {
  implementation("io.ktor:ktor-server-core:$ktorVersion")
}
Run Code Online (Sandbox Code Playgroud)

UPD:目前解决此问题的推荐方法是使用https://docs.gradle.org/current/userguide/platforms.html

dependencies {
    implementation(libs.groovy.core)
    implementation(libs.groovy.json)
    implementation(libs.groovy.nio)
}
Run Code Online (Sandbox Code Playgroud)

  • 更干净,但可能会更慢,因为 buildSrc/src/main/kotlin/myPackage/Versions.kt 中的任何版本的更新都会导致 gradle 重新编译构建脚本。请参阅 https://melix.github.io/blog/2021/03/version-catalogs.html (7认同)