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

时间:2018-09-19 08:44:25

标签: gradle kotlin gradle-kotlin-dsl

我正在将 Gradle 构建脚本从 Groovy 迁移到 Kotlin DSL ,其中一个未真正记载的事情是如何填充extra properties

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}" }

看起来很重复。

在{em> Kotlin 中实施ExtraPropertiesExtension有点复杂,但是最后,它只保留了普通的旧Map<String, Object>

所以,我的问题:是否可以比重复extra更容易地填充具有多个属性的val myProp by extra { "myValue"}对象?

2 个答案:

答案 0 :(得分:1)

根据当前(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"]}")
    }
}

答案 1 :(得分:0)

您不必使用委托,只需编写extra.set("propertyName", "propertyValue")。如果需要,可以使用apply块来完成此操作:

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