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