Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unresolved reference: KotlinCompilerVersion in build.gradle.kts

In build.gradle.kts file, I include this code on the top line. Then I use KotlinCompilerVesion.VERSION below.

import org.jetbrains.kotlin.config.KotlinCompilerVersion

Some code works fine, but some code failed:

It seems like only plugins block can not enable this import.

Here works fine:

dependencies {
    Implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
    Implementation(kotlin("test", KotlinCompilerVersion.VERSION))
}

Here always wrong:

plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("android.extensions")

    /*
    * Error: Unresolved reference: KotlinCompilerVersion
    */
    id("kotlinx-serialization") version KotlinCompilerVersion.VERSION

    /*
    * Error: Unresolved reference: KotlinCompilerVersion
    */
    id("kotlinx-serialization") version "$KotlinCompilerVersion.VERSION"

    /*
    * Error: Unresolved reference: KotlinCompilerVersion
    */
    id("kotlinx-serialization") version "${KotlinCompilerVersion.VERSION}"
}

How can I use it correctly in here, without declare an ext.xxxVersion var?

like image 550
Qi Chen Avatar asked Apr 10 '19 18:04

Qi Chen


1 Answers

Yes, the syntax of the plugins DSL is limited because Gradle parses it before parsing the rest of the file, which requires the definition to be static (no references to variables, constants, etc., pretty much no code is allowed). See Limitations of the plugins DSL for details.

The way I handle defining Kotlin version only once is by actually using the version I specify in the plugins block as canonical in other sections of the file (I picked this up from this blog post by Simon Wirtz) like so:

import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper

val kotlinVersion = plugins.getPlugin(KotlinPluginWrapper::class.java)
        .kotlinPluginVersion

plugins {
    kotlin("jvm") version "1.3.30"
}

dependencies {
    implementation(platform(kotlin("bom", kotlinVersion)))
    implementation(kotlin("stdlib-jdk8"))
}

But yeah, in the plugins block it needs to be static and unfortunately repeated if needed.


Update: I actually just learned it's possible to use constants in the plugins DSL, but they must be defined before Gradle parses the build.gradle.kts file, i.e. from buildSrc. I noticed this in the fuel library. In essence, create buildSrc/build.gradle.kts with the following contents:

plugins {
    `kotlin-dsl`
}

repositories {
    jcenter()
}

Then create buildSrc/src/main/kotlin/Constants.kt with the following contents:

object Kotlin {
    const val version = "1.3.30"
}

And then you'll be able to use the following in your main build.gradle.kts:

plugins {
    kotlin("jvm") version Kotlin.version
}
like image 112
mig4 Avatar answered Oct 01 '22 14:10

mig4