我正在尝试像在groovy中那样组织我的构建文件,方法是将值放在单独的文件中以便重用。但我无法理解在kotlin DSL中做同样事情的语法。
这是我在root build.gradle.kts中使用的内容:
applyFrom("config.gradle.kts")
buildscript {
repositories {
google()
jcenter()
}
dependencies {
val test = project.extra["minSdkVer"]
classpath("com.android.tools.build:gradle:3.0.0-alpha4")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-5")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
以下是引用的config.gradle.kts中的内容:
mapOf(
Pair("minSdkVer", 22),
Pair("targetSdkVer", 25),
Pair("compiledSdkVer", 25),
Pair("buildToolsVer", "26-rc4")
).entries.forEach {
project.extra.set(it.key, it.value)
}
但是有一个错误:
无法在额外的属性扩展上获取属性'minSdkVer' 不存在
答案 0 :(得分:6)
正确修复: Gradle在执行其他任何操作之前严格收集并应用脚本中的buildscript { ... }
块。因此,要使config.gradle.kts
内的buildscript
属性可用,您应该将applyFrom("config.gradle.kts")
移至buildscript { ... }
块:
buildscript {
applyFrom("config.gradle.kts")
/* ... */
}
另一个可能的错误是在另一个extra["minSdkVer"]
的范围内使用额外属性ExtensionAware
,就像本例中的任务一样:
val myTask = task("printMinSdkVer") {
doLast {
println("Extra property value: ${extra["minSdkVer"]}")
}
}
在这种情况下,extra.get(...)
不使用project.extra
,而是使用任务的extra
。
要解决此问题,请指定您使用该项目。直接使用:
println(project.extra["minSdkVer"])
代表团。
val minSdkVer by project.extra