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

时间:2019-04-10 18:58:10

标签: kotlin build.gradle gradle-kotlin-dsl

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 var?

1 个答案:

答案 0 :(得分:2)

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

我只定义一次Kotlin版本的方式是,通过实际使用我在plugins块中指定的版本作为文件其他部分的规范(我从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
}