Emile Achadde
Emile Achadde

Reputation: 1815

How to parametrize Kotlin version in the plugins block of a build.gradle.kts script?

In the script below:

val kotlinVersion by extra ("1.3.61")

println("Version "+kotlinVersion)

plugins {
    kotlin("jvm") version kotlinVersion
}

The variable kotlinVersion is correctly printed. Nevertheless it is not recognized in the plugins block and the following error is risen:

e: /home/achadde/sources/kotlin/minichain/build.gradle.kts:6:27: Unresolved reference: kotlinVersion

How can I fix this?

Upvotes: 25

Views: 6478

Answers (2)

Willi Mentzel
Willi Mentzel

Reputation: 29844

Short answer:

There is currenlty no way of accessing anything of the outer scope from inside the lambda passed to plugins.

Long answer:

In case you use IntelliJ it will show you a bit more information:

'val kotlinVersion: String' can't be called in this context by implicit receiver. Use the explicit one if necessary.

The outer scope (this@Build_gradle) where you define kotlinVersion is not avaiable in the this@plugins scope so you have to define kotlinVersion inside the plugins lambda.

Since the extra delegate isn't available there either you can't use it:

plugins {
    val kotlinVersion = "1.3.61"
    // ...
}

Unfortunately using a label does not work:

val kotlinVersion by extra ("1.3.61")

plugins {
    // ... Unresolved reference: kotlinVersion 
    kotlin("jvm") version this@Build_gradle.kotlinVersion
}

Upvotes: 22

Andrey Kaipov
Andrey Kaipov

Reputation: 705

For whatever reason, the plugins block can't read the outer scope, so what I did was added the following entry to my settings.gradle.kts instead:

pluginManagement.resolutionStrategy.eachPlugin {
    if (requested.id.id.startsWith("org.jetbrains.kotlin.")) {
        useVersion("1.4.10")
    }
}

With my build.gradle.kts now as follows:

plugins {
    kotlin("jvm")
    kotlin("kapt")
}

println(kotlin.coreLibrariesVersion)

Note how the version can now be omitted. The following print statement will print out the version we specified in our settings.gradle.kts, if we ever want to access our Kotlin version further down in our build script.

Upvotes: 3

Related Questions