如何在Kotlin DSL中设置gradle额外属性?

时间:2017-06-16 12:22:08

标签: 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()
    }
}

以下是引用的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'   不存在

1 个答案:

答案 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