Day*_*ykm 11 gradle kotlin gradle-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()
}
}
Run Code Online (Sandbox Code Playgroud)
以下是正在引用的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)
}
Run Code Online (Sandbox Code Playgroud)
但是有一个错误:
无法在额外的属性扩展上获取属性'minSdkVer',因为它不存在
正确的解决方法: Gradle buildscript { ... }在执行其他任何操作之前严格收集并应用脚本中的块.因此,要使您的属性在config.gradle.kts内部可用buildscript,您应该移动applyFrom("config.gradle.kts")到您的buildscript { ... }块:
buildscript {
applyFrom("config.gradle.kts")
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
另一个可能的错误是extra["minSdkVer"]在另一个范围内使用额外属性ExtensionAware,例如此示例中的任务:
val myTask = task("printMinSdkVer") {
doLast {
println("Extra property value: ${extra["minSdkVer"]}")
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,extra.get(...)不使用任务project.extra而是使用extra任务.
要解决此问题,请指定您使用该项目.直接使用:
println(project.extra["minSdkVer"])
Run Code Online (Sandbox Code Playgroud)
代表团.
val minSdkVer by project.extra
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4700 次 |
| 最近记录: |