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

时间:2018-11-29 17:22:18

标签: gradle kotlin build.gradle gradle-kotlin-dsl

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),并对依赖项和插件保持相同。

4 个答案:

答案 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"]