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

Qi *_*hen 8 kotlin build.gradle gradle-kotlin-dsl

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

import org.jetbrains.kotlin.config.KotlinCompilerVersion
Run Code Online (Sandbox Code Playgroud)

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

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

这里工作正常:

dependencies {
    Implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
    Implementation(kotlin("test", KotlinCompilerVersion.VERSION))
}
Run Code Online (Sandbox Code Playgroud)

这里总是出错:

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}"
}
Run Code Online (Sandbox Code Playgroud)

如何在不声明ext.xxxVersionvar 的情况下在这里正确使用它?

mig*_*ig4 6

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

我处理仅定义一次 Kotlin 版本的方法是实际使用我在插件块中指定的版本作为文件其他部分中的规范版本(我从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"))
}
Run Code Online (Sandbox Code Playgroud)

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


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

plugins {
    `kotlin-dsl`
}

repositories {
    jcenter()
}
Run Code Online (Sandbox Code Playgroud)

然后buildSrc/src/main/kotlin/Constants.kt使用以下内容创建:

object Kotlin {
    const val version = "1.3.30"
}
Run Code Online (Sandbox Code Playgroud)

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

plugins {
    kotlin("jvm") version Kotlin.version
}
Run Code Online (Sandbox Code Playgroud)