gradle 如何在 Kotlin DSL 中设置额外的属性?
How are gradle extra properties set in the Kotlin DSL?
我正尝试像在 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)
}
但是出现错误:
Cannot get property 'minSdkVer' on extra properties extension as it
does not exist
正确的修复: Gradle 在执行脚本中的任何其他内容之前严格收集并应用脚本中的 buildscript { ... }
块。因此,要使 config.gradle.kts
中的属性在 buildscript
中可用,您应该将 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
我正尝试像在 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)
}
但是出现错误:
Cannot get property 'minSdkVer' on extra properties extension as it does not exist
正确的修复: Gradle 在执行脚本中的任何其他内容之前严格收集并应用脚本中的 buildscript { ... }
块。因此,要使 config.gradle.kts
中的属性在 buildscript
中可用,您应该将 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