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
Работа?
Обновление: Есть несколько уродливых подходов:
В примере 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.
Аналогично описанному выше, объявите их в блоке 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