为什么不能在 build.gradle.kts 中使用 `const val`

Why cannot be `const val` used in build.gradle.kts

我想在 guild.gradle.kts 文件中定义一个版本常量,这样它甚至可以在 plugins 块中使用。 plugins 块需要 restricted syntax:

«plugin version» must be constant, literal, strings

根据限制,我尝试定义一个版本常量:

const val kotlinVersion = "1.3.72"

plugins {
    java
    kotlin("jvm") version kotlinVersion
}

但是失败并显示消息

Const 'val' are only allowed on top level or in objects

尽管声明似乎符合所有const requirements。为什么不能在 build.gradle.kts 中使用 const val

尽管您的构建脚本看起来是顶级的,但事实并非如此。 gradle 文档在解释构建的生命周期时提到了这一点:

Finally, evaluate each Project by executing its build.gradle file, if present, against the project.

(source) 这意味着在您的 kotlin 构建脚本中,接收器类型(即 this)是 KotlinBuildScript,它最终是 Project 的子类。我不知道它是如何评估的细节,但我可以想象它等同于你在 Kotlin 中使用接收器类型可以做的事情:

fun Project.evaluate(buildScript: Project.() -> Unit) = this.evaluate()

所以你的构建脚本实际上只是一个闭包的内部,因此你不能使用 const val