Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 863
Daykm Avatar asked Jun 16 '17 12:06

Daykm


People also ask

What is the Kotlin Gradle DSL?

Gradle's Kotlin DSL provides an alternative syntax to the traditional Groovy DSL with an enhanced editing experience in supported IDEs, with superior content assist, refactoring, documentation, and more.

What is DSL in Gradle?

Simply, it stands for 'Domain Specific Language'. IMO, in gradle context, DSL gives you a gradle specific way to form your build scripts. More precisely, it's a plugin-based build system that defines a way of setting up your build script using (mainly) building blocks defined in various plugins.


1 Answers

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
like image 119
hotkey Avatar answered Oct 21 '22 13:10

hotkey