为什么不能在 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
。
我想在 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 itsbuild.gradle
file, if present, against the project.
(source) 这意味着在您的 kotlin 构建脚本中,接收器类型(即 this
)是 KotlinBuildScript
,它最终是 Project
的子类。我不知道它是如何评估的细节,但我可以想象它等同于你在 Kotlin 中使用接收器类型可以做的事情:
fun Project.evaluate(buildScript: Project.() -> Unit) = this.evaluate()
所以你的构建脚本实际上只是一个闭包的内部,因此你不能使用 const val
。