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

cze*_*rny 3 constants gradle kotlin build.gradle gradle-kotlin-dsl

我想在guild.gradle.kts文件中定义一个版本常量,以便它甚至可以在plugins块中使用。该plugins块需要受限制的语法

«plugin version» 必须是常量、文字、字符串

遵循限制,我尝试定义 a 版本常量:

const val kotlinVersion = "1.3.72"

plugins {
    java
    kotlin("jvm") version kotlinVersion
}
Run Code Online (Sandbox Code Playgroud)

但是,这失败并显示消息

Const 'val' are only allowed on top level or in objects
Run Code Online (Sandbox Code Playgroud)

即使声明似乎满足所有const 要求。为什么const val在 build.gradle.kts 中不能使用?

Nic*_*las 5

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

最后,Project通过build.gradle针对项目执行其文件(如果存在)来评估每个文件。

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

fun Project.evaluate(buildScript: Project.() -> Unit) = this.evaluate()
Run Code Online (Sandbox Code Playgroud)

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