简体   繁体   中英

How are gradle extra properties set in the Kotlin DSL?

I'm trying to organize my build files as I would in groovy, by having values in a separate file to reuse. But I cannot understand the syntax to do the same thing in the kotlin DSL.

Here's what I'm using in 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()
    }
}

and here's whats in the config.gradle.kts that is being referenced:

mapOf(
        Pair("minSdkVer", 22),
        Pair("targetSdkVer", 25),
        Pair("compiledSdkVer", 25),
        Pair("buildToolsVer", "26-rc4")
).entries.forEach {
    project.extra.set(it.key, it.value)
}

But there's an error:

Cannot get property 'minSdkVer' on extra properties extension as it does not exist

A correct fix: Gradle collects and applies the buildscript { ... } blocks from your script strictly before executing anything else from it. So, to make your properties from config.gradle.kts available inside the buildscript , you should move applyFrom("config.gradle.kts") to your buildscript { ... } block:

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

    /* ... */
}

Another possible mistake is using an extra property as extra["minSdkVer"] in a scope of another ExtensionAware , like a task in this example:

val myTask = task("printMinSdkVer") {
    doLast {
        println("Extra property value: ${extra["minSdkVer"]}")
    }
}

In this case, extra.get(...) uses not the project.extra but the extra of the task.

To fix that, specify that you work with the project. Direct usage:

println(project.extra["minSdkVer"])

And for delegation.

val minSdkVer by project.extra

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM