ext в buildscript не может быть распознан Gradle Kotlin DSL

В эти дни я пытаюсь написать несколько кодов, чтобы испытать реактивные функции Spring и расширение kotlin в Spring 5, и я также подготовил сборку Kotlin DSL build.gradle.kt для настройки сборки сборки.

build.gradle.kt конвертируется из кодов шаблонов Spring Boot, сгенерированных http://start.spring.io.

Но ext в buildscript не может быть обнаружен Gradle.

buildscript {
  ext { }
}

ext вызовет Gradle строить ошибку.

Чтобы переменные в classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") и compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion"), я добавил переменные трудным путем.

val kotlinVersion = "1.1.4"
val springBootVersion = "2.0.0.M3"

Но я должен объявить их в глобальном верхнем расположении и скопировать их в buildscript.

Код: https://github.com/hantsy/spring-reactive-sample/blob/master/kotlin-gradle/build.gradle.kts

Есть ли изящный подход, чтобы заставить ext работать?

Обновление: Есть несколько уродливых подходов:

  1. На примере DSL Gradle Kotlin https://github.com/gradle/kotlin-dsl/tree/master/samples/project-properties объявляет свойства в gradel.properties.

    kotlinVersion = 1.1.4
    springBootVersion = 2.0.0.M3
    

    И используйте его в build.gradle.kts.

    buildScript{
       val kotlinVersion by project
    
    }
     val kotlinVersion by project //another declare out of buildscript block.
    
  2. Аналогично описанному выше, объявите их в блоке buildScript:

    buildScript{
       extra["kotlinVersion"] = "1.1.4"
       extra["springBootVersion"] = "2.0.0.M3"
       val kotlinVersion: String by extra
    
    }
     val kotlinVersion: String by extra//another declare out of buildscript block.
    

Как я могу избежать дублирования val kotlinVersion: String на extra?

Ответы

Ответ 1

С Kotlin DSL ext был изменен на extra, и его можно использовать в buildscript.

Например: -

buildscript {
    // Define versions in a single place
    extra.apply{
        set("minSdkVersion", 26)
        set("targetSdkVersion", 27)
    }
}

Ответ 2

То, что работает для меня, - это использование ext во всех allprojects а не buildscript, поэтому в вашем top-level build.gradle.kts

allprojects {
  ext {
    set("supportLibraryVersion", "26.0.1")
  }
}

то вы можете использовать его в файлах build.gradle.kts в таких модулях:

val supportLibraryVersion = ext.get("supportLibraryVersion") as String

Ответ 3

Глобальные свойства в kotlin-gradle-dsl:
fooobar.com/questions/14806940/...


Версия Kotlin встроена в Kotlin-Gradle-DSL.
Вы можете использовать зависимости со встроенной версией следующим образом:

implementation(embeddedKotlin("stdlib-jdk7"))

classpath(embeddedKotlin("gradle-plugin"))

Ответ 4

В Kotlin появилась новая возможность, которую мы можем использовать:

object DependencyVersions {
    const val JETTY_VERSION = "9.4.12.v20180830"
}

dependencies{
    implementation("org.eclipse.jetty:jettyserver:${DependencyVersions.JETTY_VERSION}")
}

Здесь DependencyVersions - это имя, которое я выбрал. Вы можете выбрать другое имя, например "MyProjectVariables". Это способ избежать использования дополнительных или дополнительных свойств.