gradle - 如何有效地填充 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有点复杂,但最后,它只是简单的 old 。Map<String, Object>
所以,我的问题是:是否可以extra
更容易地填充具有多个属性的对象,而不仅仅是重复val myProp by extra { "myValue"}
?
解决方案
根据当前的 ( 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"]}")
}
}
推荐阅读
- python-2.7 - 将 Selenium 与 Gitlab CI 集成
- java - 无法在 Java 中解析 web.xml 文件
- android - 在 ~/android-build\build\outputs\apk\debug 中生成的 Qt Android 输出 apk
- python-3.x - 将包含整数和字符串的列表转换为嵌套元组,Python
- c++ - 即时将 C++ 仿真数据写入 HDF5 文件
- sql - 减号或破折号 SQL ms Access 的验证规则
- r - 通过多个条件从因子列创建新列
- sql-server-2008 - 公用表表达式——在谓词中使用变量
- java - 单选按钮使单选按钮外圈的颜色与选择单选按钮时的颜色不同
- pyqt5 - pyqt5 格式化使用多种布局