在build.gradle.kts
文件中,我将此代码放在第一行。然后,我在下面使用KotlinCompilerVesion.VERSION。
import org.jetbrains.kotlin.config.KotlinCompilerVersion
某些代码可以正常工作,但是某些代码失败:
似乎只有plugins
块无法启用此import
。
在这里工作正常:
dependencies {
Implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
Implementation(kotlin("test", KotlinCompilerVersion.VERSION))
}
这里总是错:
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}"
}
如何在这里正确使用它而无需声明ext.xxxVersion
var?
答案 0 :(得分:2)
是的,插件DSL的语法受到限制,因为Gradle在解析文件的其余部分之前对其进行了解析,这要求该定义是静态的(没有对变量,常量等的引用,几乎没有代码是允许的)。有关详细信息,请参见Limitations of the plugins DSL。
我只定义一次Kotlin版本的方式是,通过实际使用我在plugins块中指定的版本作为文件其他部分的规范(我从this blog post by 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"))
}
但是,是的,在插件块中,它必须是静态的,不幸的是,如果需要的话,可以重复进行。
更新:我实际上已经知道可以在插件DSL中使用常量,但是必须在Gradle解析build.gradle.kts
文件之前(即从buildSrc
解析)中定义常量。我在fuel库中注意到了这一点。本质上,使用以下内容创建buildSrc/build.gradle.kts
:
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
然后使用以下内容创建buildSrc/src/main/kotlin/Constants.kt
:
object Kotlin {
const val version = "1.3.30"
}
然后您将可以在主要build.gradle.kts
中使用以下内容:
plugins {
kotlin("jvm") version Kotlin.version
}