我正在尝试像在 groovy 中一样组织我的构建文件,方法是将值放在一个单独的文件中以供重用。但是我无法理解在 kotlin DSL 中做同样事情的语法。
这是我在根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",因为它 不存在
正确的解决方法:Gradle 会在执行脚本中的其他任何内容之前严格收集并应用脚本中的buildscript { ... }
块。因此,要使您的属性在buildscript
内可用config.gradle.kts
,您应该applyFrom("config.gradle.kts")
移动到buildscript { ... }
块:
buildscript {
applyFrom("config.gradle.kts")
/* ... */
}
另一个
可能的错误是在另一个ExtensionAware
的作用域中使用额外的属性作为extra["minSdkVer"]
,就像本例中的任务一样:
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