Как эффективно заполнить дополнительные свойства в 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}" }

что выглядит довольно повторяющимся.

Реализация ExtraPropertiesExtension в Kotlin < / em> немного сложен, но, в конце концов, содержит просто старый добрый Map<String, Object>.

Итак, мой вопрос: возможно ли заполнить объект extra несколькими свойствами проще, чем просто повторять val myProp by extra { "myValue"}?


person Vít Kotačka    schedule 19.09.2018    source источник
comment
Возможно, вам будет полезен этот вопрос: stackoverflow.com/questions/44589153/   -  person Opal    schedule 19.09.2018
comment
@Opal Я прочитал вопрос, который вы упоминаете, но, хотя он затрагивает очень похожую тему, он не задает и не отвечает на мою проблему. Однако есть альтернативное решение в Kotlin DSL (mapOf - ›forEach -› extra.set()), но IMHO оно запутывает цель (менее читабельно).   -  person Vít Kotačka    schedule 19.09.2018
comment
Может как то так? extra.properties.putAll(pairs = listOf( "comp" to "filebeat", "compVersion" to "6.4.0" ))   -  person Czar    schedule 22.11.2018
comment
или просто серию extra["key"] = "value"   -  person Czar    schedule 22.11.2018


Ответы (2)


Согласно текущей (5.2.1) документации:

Все улучшенные объекты в модели предметной области Gradle могут содержать дополнительные определяемые пользователем свойства. Сюда входят, помимо прочего, проекты, задачи и исходные наборы.

Дополнительные свойства могут быть добавлены, прочитаны и установлены через свойство extra объекта-владельца. В качестве альтернативы их можно решить через делегированные Kotlin свойства с помощью by extra.

Вот пример использования дополнительных свойств для объектов Project и Task:

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"]}")
    }
}
person Vít Kotačka    schedule 19.02.2019

Вам не нужно использовать делегирование, просто напишите extra.set("propertyName", "propertyValue"). Вы можете сделать это с помощью блока apply, если хотите:

extra.apply {
    set("propertyName", "propertyValue")
    set("propertyName2", "propertyValue2")
}
person Malcolm    schedule 14.01.2019