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

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',因为它不存在

hot*_*key 6

正确的解决方法: 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)