Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我无法访问“中的项目属性”;插件;使用gradle Kotlin DSL(5.0)的build.gradle.kts部分?_Gradle_Kotlin_Build.gradle_Gradle Kotlin Dsl - Fatal编程技术网

为什么我无法访问“中的项目属性”;插件;使用gradle Kotlin DSL(5.0)的build.gradle.kts部分?

为什么我无法访问“中的项目属性”;插件;使用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 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: 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
中的
插件管理
来管理插件版本,您可以在此处使用项目属性,请参见: