一段时间以来,我一直在使用常用的Groovy构建脚本DSL用几种语言编写Gradle插件。最近,我想学习如何使用他们的Kotlin构建脚本DSL,但我不太明白一些事情。
下面是我的一个例子:
val kotlin_version = "1.2.41"
plugins {
application
kotlin("jvm").version(kotlin_version)
}
application {
mainClassName = "samples.HelloWorldKt"
}
dependencies {
compile(kotlin("stdlib"))
}
repositories {
jcenter()
}然而,当我运行一个简单的任务,比如'clean',我得到了下面的错误:
* What went wrong:
Script compilation error:
Line 5: kotlin("jvm") version kotlin_version
^ Unresolved reference: kotlin_version但是,如果我将kotlin_version替换为字符串文字,它就能正常工作:
val kotlin_version = "1.2.41"
plugins {
application
// kotlin("jvm").version(kotlin_version)
kotlin("jvm").version("1.2.41")
}
application {
mainClassName = "samples.HelloWorldKt"
}
dependencies {
compile(kotlin("stdlib"))
}
repositories {
jcenter()
}但是,如果我用我的kotlin_version参数化dependencies块,它就能很好地工作:
dependencies {
compile(kotlin("stdlib", kotlin_version))
}为什么不能在plugins块内引用变量?
发布于 2018-06-06 06:37:29
参见文档:https://docs.gradle.org/current/userguide/plugins.html#sec:constrained_syntax基本上,它声明插件版本必须是常量、文字、字符串。
它是由DslMaker实现的:https://kotlinlang.org/docs/reference/type-safe-builders.html#scope-control-dslmarker-since-11
如果您想在其他地方重用变量,您可以使用以下代码:
buildscript {
var kotlinVersion: String by extra { "1.2.41" }
repositories {
jcenter()
}
dependencies {
classpath(kotlin("gradle-plugin", kotlinVersion))
}
}
plugins {
application
}
application {
mainClassName = "samples.HelloWorldKt"
}
apply {
plugin("kotlin")
plugin("application")
}
val kotlinVersion: String by extra
repositories {
jcenter()
}
dependencies {
compile(kotlin("stdlib-jdk8", kotlinVersion))
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}如果不需要,可以简单地内联变量kotlin_version的内容
https://stackoverflow.com/questions/50704499
复制相似问题