18

我正在尝试像在 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”,因为它不存在

4

1 回答 1

20

正确的解决方法: Gradlebuildscript { ... }在执行任何其他操作之前严格收集并应用脚本中的块。因此,要使您的属性在config.gradle.kts内部可用buildscript,您应该移至applyFrom("config.gradle.kts")您的buildscript { ... }块:

buildscript {
    applyFrom("config.gradle.kts")

    /* ... */
}

extra["minSdkVer"]另一个可能的错误是在 another 的范围内使用额外的属性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
于 2017-06-16T13:00:28.700 回答