如何在 Gradle Kotlin DSL 中有效地填充额外的属性?



我正在将Gradle构建脚本从Groovy迁移到Kotlin DSL,其中一件没有真正记录的事情是如何填充额外的属性。

Groovy中,我可以写:

ext {
comp = 'node_exporter'
compVersion = '0.16.0'
compProject = 'prometheus'
arch = 'linux-amd64'
tarball = "v${compVersion}/${comp}-${compVersion}.${arch}.tar.gz"
downloadSrc = "https://github.com/${compProject}/${comp}/releases/download/${tarball}"
unzipDir = "${comp}-${compVersion}.${arch}"
}

我发现在Kotlin DSL中,我可以通过以下方式实现相同的功能:

val comp by extra { "filebeat" }
val compVersion by extra { "6.4.0" }
val arch by extra { "linux-x86_64" }
val tarball by extra { "${comp}-${compVersion}-${arch}.tar.gz" }
val downloadSrc by extra { "https://artifacts.elastic.co/downloads/beats/${comp}/${tarball}" }
val unzipDir by extra { "${comp}-${compVersion}-${arch}" }

这看起来很重复。

Kotlin中实现 ExtraPropertiesExtension 有点复杂,但最后,它包含的只是普通的旧Map<String, Object>

所以,我的问题:是否可以更轻松地使用多个属性填充extra对象,而不仅仅是重复val myProp by extra { "myValue"}

根据当前的(5.2.1(文档:

Gradle 域模型中的所有增强对象都可以保存额外的用户定义属性。这包括但不限于项目、任务和源集。

可以通过拥有对象的extra属性添加、读取和设置额外的属性。或者,可以使用by extra通过 Kotlin 委托属性对它们进行寻址。

下面是在ProjectTask对象上使用额外属性的示例:

val kotlinVersion by extra { "1.3.21" }
val kotlinDslVersion by extra("1.1.3")
extra["isKotlinDsl"] = true
tasks.register("printExtProps") {
extra["kotlinPositive"] = true
doLast {
// Extra properties defined on the Project object
println("Kotlin version: $kotlinVersion")
println("Kotlin DSL version: $kotlinDslVersion")
println("Is Kotlin DSL: ${project.extra["isKotlinDsl"]}")
// Extra properties defined on the Task object
// this means the current Task
println("Kotlin positive: ${this.extra["kotlinPositive"]}")
}
}

您不必使用委派,只需编写extra.set("propertyName", "propertyValue")即可。如果需要,您可以使用apply块执行此操作:

extra.apply {
set("propertyName", "propertyValue")
set("propertyName2", "propertyValue2")
}

最新更新