В настоящее время в Kotlin DSL есть ограничения (5.3), которые не позволяют везде проверять время компиляции.Чтобы Kotlin DSL работал, он должен добавить расширения поверх API Gradle и не может сделать это волшебным образом.Прежде всего вам нужно пройти страницу Kotlin DSL Primer , чтобы понять это.
Как мне извлечь плагин, применяемый к сценариям включения (чтобы избежать перегрузки сценариев модуля Gradle)?
Один из способов сделать это - использовать предварительно скомпилированные сценарии сборки с плагином Kotlin DSL.Для этого вам нужно переместить ваш скрипт в проект $rootDir/buildSrc
.Вот как это может выглядеть:
// $rootDir/buildSrc/build.gradle.kts
plugins {
`kotlin-dsl`
}
repositories {
maven {
url = uri("http://host:8082/artifactory/...")
}
}
Затем поместите ваш общий скрипт так:
// $rootDir/buildSrc/src/main/kotlin/common.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.3.21"
}
tasks.compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
tasks.compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Затем вы можете применить этот скрипт как к плагину, подобному этому:
// $rootDir/build.gradle.kts
subprojects {
apply(id = "common")
}
Как я могу использовать предварительно скомпилированные плагины скриптов без доступа к общедоступным глобальным репозиториям?
Настройка пользовательских репозиториев для плагина скомпилированных скриптов ничем не отличается от вашего обычного скрипта сборки.Сделайте это так:
// $rootDir/buildSrc/settings.gradle.kts
pluginManagement {
repositories.maven {
url = uri("http://host:8082/artifactory/...")
}
}
Другой путь, если вы не хотите использовать предварительно скомпилированные плагины, это явно настроить расширения.Вы можете сделать это так:
// $rootDir/gradle/common.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
А в основном скрипте:
// $rootDir/build.gradle.kts
subprojects {
apply {
plugin(KotlinPlatformJvmPlugin::class)
from("common.gradle.kts")
}
}
Как я могу поместить все общие константы (например, версии зависимостей) в отдельный файлвключить их, просто используя что-то вроде springBootVersion или Constants.springBootVersion с проверками во время компиляции?
В настоящее время нет хорошего способа сделать это.Вы можете использовать дополнительные свойства, но это не гарантирует проверки времени компиляции.Примерно так:
// $rootDir/dependencies.gradle.kts
// this will try to take configuration from existing ones
val compile by configurations
val api by configurations
dependencies {
compile("commons-io:commons-io:1.2.3")
api("some.dep")
}
// This will put your version into extra extension
extra["springBootVersion"] = "1.2.3"
И вы можете использовать его так:
// $rootDir/build.gradle.kts
subprojects {
apply {
plugin<JavaLibraryPlugin>()
from("$rootDir/dependencies.gradle.kts")
}
А в вашем модуле:
// $rootDir/module/build.gradle.kts
// This will take existing dependency from extra
val springBootVersion: String by extra
dependencies {
compile("org.spring:boot:$springBootVersion")
}