为什么我无法访问“中的项目属性”;插件;使用gradle Kotlin DSL(5.0)的build.gradle.kts部分?
Gradle 5.0,Kotlin DSL 创建为什么我无法访问“中的项目属性”;插件;使用gradle Kotlin DSL(5.0)的build.gradle.kts部分?,gradle,kotlin,build.gradle,gradle-kotlin-dsl,Gradle,Kotlin,Build.gradle,Gradle Kotlin Dsl,Gradle 5.0,Kotlin DSL 创建gradle.properties文件: kotlinVersion=1.3.10 val kotlinVersion: String by project println(kotlinVersion) // works plugins { kotlin("jvm").version(kotlinVersion) // ^ Unresolved reference: kotlinVersi
gradle.properties
文件:
kotlinVersion=1.3.10
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
}
}
创建build.gradle.kts
文件:
kotlinVersion=1.3.10
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版本从构建脚本中移出,这样我可以在以后修改它(例如,通过命令行,
..-PkotlinVersion=1.3.0
),并且使依赖项和插件保持相同。插件块与构建脚本的其余部分分开计算,因为您正在使用的插件集决定了构建脚本其余部分的类路径(以及名称解析范围)。因此,插件
块之外的声明不能在该块内部使用。正如@yole在他的回答中所说,插件{…}
块是一个特殊的构造,在构建脚本的其余部分之前进行评估,并且对Gradle模型的访问有限
传递属性并在plugins{…}
DSL中使用它的一种方法是使用:
通过命令行传递系统属性的方法是
-DkotlinVersion=1.3.0
我通常使用buildSrc
目录来定义表示我希望重用的版本或属性的对象,特别是当我有多个项目或多个依赖项与版本控制保持同步时。我整理了一个小的示例项目来演示如何使用
在buildSrc/src/main/kotlin/Versions.kt中,我有:
对象版本{
//图书馆版本
val Kotlin=“1.3.10”
val logback=“1.2.3”
//插件版本
对象插件{
//如果要使用与库版本不匹配的版本,则可以更改
val Kotlin=Versions.Kotlin
}
}
我在其他地方也这样使用它:
插件{
kotlin(“jvm”)版本Versions.Plugins.kotlin
}
//剪断。。。
依赖关系{
编译(kotlin(“stdlib-jdk8”))
编译(group=“ch.qos.logback”,name=“logback classic”,version=Versions.logback)
}
这些是在Versions.kt
文件中静态定义的,但是您也可以从环境、文件或属性中读取它们。真正的关键是,您的buildSrc
是在所有其他步骤之前进行评估的,因此它可用于构建脚本中的所有其他阶段(至少是我尝试过的所有阶段!)。属性可以通过以下方式访问:
project.properties["kotlinVersion"]
有什么方法可以将这个版本外部化吗?一个额外的好处是,您可以将编译后的类包含到应用程序中,这样在运行时就可以获得这些信息。我甚至没有想到这一点!创建一个包含所有依赖项和版本的文件(例如)可能比gradle任务更符合人体工程学。使用-P
而不是-D
参数难道不可能吗?@mochadwi,在最近的gradle版本中,您可以使用设置.gradle.kts
中的插件管理
来管理插件版本,您可以在此处使用项目属性,请参见: