Почему я не могу получить доступ к свойствам проекта в разделе «плагины» build.gradle.kts с помощью Gradle Kotlin DSL (5.0)? - PullRequest
0 голосов
/ 29 ноября 2018

Gradle 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) итакже сохранить его одинаковым как для зависимостей, так и для плагинов.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Как сказал @yole в своем ответе, блок plugins { ... } - это специальная конструкция, которая оценивается до остальной части сценария сборки и имеет ограниченный доступ к модели Gradle.

Один из способов передачисвойство и использовать его в plugins { ... } DSL - это использовать системные свойства :

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.

0 голосов
/ 29 ноября 2018

Обычно я использую каталог buildSrc для определения объектов, представляющих версии или свойства, которые я хочу использовать повторно, особенно когда у меня есть несколько проектов или несколько зависимостей, которые остаются на шаге от контроля версий.Я собрал небольшой пример проекта здесь , который демонстрирует использование.

В 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 оценивается до всего остального, поэтому он доступен для всех других этапов в вашем скрипте сборки (По крайней мере, все те, которые я пробовал!) .

0 голосов
/ 29 ноября 2018

Блок plugins оценивается отдельно от остальной части сценария сборки, поскольку набор используемых плагинов определяет путь к классу (и область разрешения имен) для остальной части сценария сборки.Из-за этого объявления вне блока plugins не могут использоваться внутри этого блока.

...