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?

11 ответов

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

Например:-

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

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

Ни один из этих ответов не казался мне ясным. Итак, вот мое объяснение:

/build.gradle.kts:

      buildscript {
    extra.apply {
        set("compose_version", "1.0.3")
    }
    ...
}

/app/build.gradle.kts :

      val composeVersion = rootProject.extra["compose_version"]
implementation("androidx.compose.ui:ui:$composeVersion")
implementation("androidx.compose.material:material:$composeVersion")

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

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

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

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

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

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

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

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

Глобальные свойства в kotlin-gradle-dsl:
/questions/45609076/ne-mogu-ispolzovat-dopolnitelnyie-svojstva-proekta-v-bloke-plaginov/45609088#45609088


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

implementation(embeddedKotlin("stdlib-jdk7"))

classpath(embeddedKotlin("gradle-plugin"))
      val junitVersion by extra("4.13.2")
testImplementation("junit:junit:$junitVersion")

В Котлине это можно сделать с помощью блока или .

Сby extra:

      val kotlinVersion = "95" by extra
val kotlinCompiler = true by extra

Сext:

      ext {
    set("kotlinVersion", "95")
    set("kotlinCompiler", true)
}

Между тем, из последнего стиля кода выше не будет работать, только с некоторыми фрагментами. Однако добавилpluginsзаблокируйте, если кому-то нужен способ справиться с тем же в.ktsфайловая система.

/build.gradle.kts:

      buildscript {
    extra.apply {
        set("compose_ui_version", "1.2.0")
    }
}// Top-level build file where you can add configuration options common to all sub-projects/modules.

plugins {
    id("com.android.application") version "7.4.0" apply false
    id("com.android.library") version "7.4.0" apply false
    id("org.jetbrains.kotlin.android") version "1.7.0" apply false
}

/приложение/build.gradle.kts:

      dependencies {
    val composeUiVersion = rootProject.extra["compose_ui_version"]
    implementation("androidx.compose.ui:ui:$composeUiVersion")
    implementation("androidx.compose.ui:ui-tooling-preview:$composeUiVersion")
    androidTestImplementation ("androidx.compose.ui:ui-test-junit4:$composeUiVersion")
    debugImplementation ("androidx.compose.ui:ui-tooling:$composeUiVersion")
    debugImplementation ("androidx.compose.ui:ui-test-manifest:$composeUiVersion")
}

Установите это так:

      val kotlinVersion by extra("1.1.4")

Используйте это так:

      val kotlinVersion: String by rootProject.extra

Это возможность определять глобальные свойства в gradle.properties:

      xyzVersion=1.0.0

А затем используйте их в своем модуле build.gradle.kts:

      val xyzVersion: String by project
Другие вопросы по тегам