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

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

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. Из примера Gradle Kotlin DSL, 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 дополнительным?


person Hantsy    schedule 18.08.2017    source источник
comment
Не знаю, как избежать дублирования, но вы можете присоединиться: extra["kotlinVersion"] = "1.1.4" val kotlinVersion: String by extra к val kotlinVersion: String by extra("1.1.4")   -  person Claus Holst    schedule 03.12.2017
comment
@ClausHolst Отличное разъяснение!   -  person neu242    schedule 29.10.2019


Ответы (5)


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

Eg :-

buildscript {
    // Define versions in a single place
    extra.apply{
        set("minSdkVersion", 26)
        set("targetSdkVersion", 27)
    }
}
person Shashi Bhushan    schedule 26.12.2018
comment
Как бы это сработало, если бы я хотел добавить функцию к объекту extras? - person Squeazer; 23.04.2019
comment
Можете ли вы добавить пример того, как использовать собственность? Просто implementation("org.library:library:$myVersion") не работает. - person Jorn; 21.02.2020
comment
К сожалению, в buildscript у меня это не работает. - person Sir Codesalot; 07.07.2020
comment
Чтение дополнительных свойств: val myVersion: String by rootProject.extra implementation("org.library:library:$myVersion") - person sylwano; 31.05.2021
comment
Это ничуть не проще, чем использовать groovy, даже если он действительно работает ... - person Chapz; 17.06.2021

Можно использовать константы, определенные в .kt файле в .gradle.kts файлах.

создайте папку buildSrc в корневой папке вашего проекта

создать buildSrc/build.gradle.kts файл со следующим содержанием

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

создать файл buildSrc/src/main/kotlin/Constants.kt со следующим содержимым

object Constants {
    const val kotlinVersion = "1.3.70"
    const val targetSdkVersion = 28
}

Синхронизировать. Теперь вы можете ссылаться на созданные константы в различных .gradle.kts файлах, подобных этому

...
classpath(kotlin("gradle-plugin", version = Constants.kotlinVersion))
...

...
targetSdkVersion(Constants.targetSdkVersion)
...
person Eugene Popovich    schedule 15.06.2020
comment
Это работает безупречно даже для многомодульных проектов и не требует некрасивого кода в сценариях сборки. Потрясающие! - person Thorbear; 01.10.2020
comment
Мне нравится это решение, спасибо! Есть ли у вас какие-либо указания о том, как поделиться buildSrc в качестве артефакта, чтобы его можно было повторно использовать между независимыми проектами? Просто ссылку на какой-нибудь документ было бы хорошо, я просто не уверен, с чего начать - person Emil Kantis; 12.01.2021
comment
@EmilKantis, извините, я не знаю такого решения. Попробуйте поискать / спросить здесь, в StackOverflow - person Eugene Popovich; 12.01.2021
comment
@EmilKantis buildSrc по сути работает как плагин Gradle, который автоматически применяется ко всем подпроектам, поэтому вам нужно создать плагин Gradle. :) - person vaughandroid; 14.05.2021

У меня работает ext в allprojects вместо buildscript, поэтому на вашем верхнем уровне build.gradle.kts

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

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

val supportLibraryVersion = ext.get("supportLibraryVersion") as String
person kamil zych    schedule 04.10.2017
comment
Или чуть более кратко: val supportLibraryVersion : String? by ext - person PaulNUK; 22.02.2019
comment
Это даже не компилируется. - person IgorGanapolsky; 14.06.2021

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

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

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

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

person Per Christian Henden    schedule 27.06.2019
comment
Я думаю, что использование сопутствующего объекта было бы более идиоматическим стилем котлина - person Matt Kerr; 09.01.2020
comment
@MattKerr совсем нет, если вам нужен синглтон, вы должны использовать object - person Joffrey; 11.04.2020
comment
Вы можете ссылаться на это в подпроектах? - person Thorbear; 01.10.2020

Глобальные свойства в kotlin-gradle-dsl:
https://stackoverflow.com/a/53594357/3557894


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

implementation(embeddedKotlin("stdlib-jdk7"))

classpath(embeddedKotlin("gradle-plugin"))
person nimelorm    schedule 03.12.2018
comment
новый способ - добавить в плагины: kotlin("jvm") и в deps: implementation(kotlin("stdlib-jdk8") - person Matt Kerr; 09.01.2020