5.0版,Kotlin DSL
创建gradle.properties
文件:
kotlinVersion=1.3.10
创建build.gradle.kts
文件:
val kotlinVersion: String by project
println(kotlinVersion) // works
plugins {
kotlin("jvm").version(kotlinVersion)
// ^ Unresolved reference: kotlinVersion
}
repositories {
jcenter()
}
tasks.register("compute") {
doLast {
println(kotlinVersion) // works
}
}
运行gradle compute
,然后更改
kotlin("jvm").version(kotlinVersion)
到
kotlin("jvm").version("1.3.10")
,然后再次运行。一切正常。
我是在做错什么吗?还是某种限制或错误?
我只是想将Kotlin版本从构建脚本中移出,所以我可以稍后再进行更改(例如,通过命令行... -PkotlinVersion=1.3.0
),并对依赖项和插件保持相同。
答案 0 :(得分:1)
plugins
块与其余构建脚本分开进行评估,因为您使用的插件集确定了其余构建脚本的类路径(和名称解析范围)。因此,plugins
块外部的声明不能在该块内部使用。
答案 1 :(得分:1)
我通常使用buildSrc
目录来定义表示要重用的版本或属性的对象,尤其是当我有多个项目或多个依赖项与版本控制保持同步时。我整理了一个示例项目here,演示了用法。
在buildSrc/src/main/kotlin/Versions.kt
中,我有:
object Versions {
// Library versions
val Kotlin = "1.3.10"
val logback = "1.2.3"
// Plugin versions
object Plugins {
// Can be changed if we want to use a version other than one matching the library version
val Kotlin = Versions.Kotlin
}
}
我在其他地方使用它,像这样:
plugins {
kotlin("jvm") version Versions.Plugins.Kotlin
}
// snip...
dependencies {
compile(kotlin("stdlib-jdk8"))
compile(group = "ch.qos.logback", name = "logback-classic", version = Versions.logback)
}
这些是在Versions.kt
文件中静态定义的,但是您也可以从环境,文件或属性中读取它们。真正的关键是您的buildSrc
在所有其他条件之前都被评估为 ,因此它可用于构建脚本中的所有其他阶段(至少我尝试过的所有阶段) !)。
答案 2 :(得分:0)
正如@yole在他的回答中所说,plugins { ... }
块是一个特殊的结构,在构建脚本的其余部分之前进行评估,并且对Gradle模型的访问受到限制。
传递属性并在plugins { ... }
DSL中使用它的一种方法是使用system properties:
val kotlinVersion = System.getProperty("kotlinVersion")?.toString()
?: error("Add a 'kotlinVersion' system property or pass -DkotlinVersion=...")
id("org.jetbrains.kotlin.multiplatform").version(kotlinVersion)
通过命令行传递系统属性的方法是-DkotlinVersion=1.3.0
。
答案 3 :(得分:0)
可以通过以下方式访问属性:
project.properties["kotlinVersion"]