Как эффективно заполнить дополнительные свойства в 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 немного сложнее, но, в конце концов, оно содержит просто старый Map<String, Object>
,
Итак, мой вопрос: возможно ли заселить extra
объект с несколькими свойствами легче, чем просто повторение val myProp by extra { "myValue"}
?
0 ответов
По текущему (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"]}")
}
}
Вам не нужно использовать делегирование, просто напишите extra.set("propertyName", "propertyValue")
, Вы можете сделать это с apply
заблокировать, если вы хотите:
extra.apply {
set("propertyName", "propertyValue")
set("propertyName2", "propertyValue2")
}