未解决的参考:build.gradle.kts 中的 KotlinCompilerVersion

Unresolved reference: KotlinCompilerVersion in build.gradle.kts

build.gradle.kts 文件中,我将此代码包含在第一行。然后我在下面使用 KotlinCompilerVesion.VERSION 。

import org.jetbrains.kotlin.config.KotlinCompilerVersion

一些代码工作正常,但一些代码失败:

似乎只有 plugins 块无法启用此 import

这里工作正常:

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

这里总是错的:

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}"
}

如何在此处正确使用它而不声明 ext.xxxVersion 变量?

是的,插件 DSL 的语法是有限的,因为 Gradle 在 解析文件的其余部分之前 解析它,这要求定义是静态的(没有对变量、常量等的引用,几乎不允许任何代码)。有关详细信息,请参阅 Limitations of the plugins DSL

我只定义一次 Kotlin 版本的方法是实际使用我在插件块中指定的版本作为文件其他部分的规范版本(我从 this blog post by Simon Wirtz 中选择了这个版本),如下所示:

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"))
}

但是,是的,在插件块中,它需要是静态的,不幸的是,如果需要,它会重复。


更新:实际上我刚刚了解到可以在插件 DSL 中使用常量,但必须在 Gradle 解析 build.gradle.kts 文件之前定义它们,即来自 buildSrc。我在 fuel 库中注意到了这一点。实质上,使用以下内容创建 buildSrc/build.gradle.kts

plugins {
    `kotlin-dsl`
}

repositories {
    jcenter()
}

然后创建buildSrc/src/main/kotlin/Constants.kt,内容如下:

object Kotlin {
    const val version = "1.3.30"
}

然后您就可以在主 build.gradle.kts 中使用以下内容:

plugins {
    kotlin("jvm") version Kotlin.version
}