Да, синтаксис плагинов DSL ограничен, потому что Gradle анализирует его перед анализом остальной части файла, что требует, чтобы определение было статическим (без ссылок на переменные, константы и т. Д., Довольномного кода не допускается).Подробнее см. Ограничения плагинов DSL .
Способ, которым я определяю версию Kotlin только один раз, заключается в том, чтобы фактически использовать версию, указанную в блоке плагинов, как каноническую в других разделах файла.(Я взял это из этого поста Саймона Вирца ) примерно так:
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper
val kotlinVersion = plugins.getPlugin(KotlinPluginWrapper::class.java)
.kotlinPluginVersion
plugins {
kotlin("jvm") version "1.3.30"
}
dependencies {
implementation(platform(kotlin("bom", kotlinVersion)))
implementation(kotlin("stdlib-jdk8"))
}
Но да, в блоке плагинов он должен быть статичным и, к сожалению, повторяться при необходимости.
Обновление : На самом деле я только что узнал, что можно использовать константы в подключаемых модулях DSL, но они должны быть определены до того, как Gradle проанализирует файл build.gradle.kts
, то есть из buildSrc
.Я заметил это в библиотеке fuel .По сути, создайте buildSrc/build.gradle.kts
со следующим содержимым:
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
Затем создайте buildSrc/src/main/kotlin/Constants.kt
со следующим содержимым:
object Kotlin {
const val version = "1.3.30"
}
И тогда вы сможете использоватьследующие в вашей главной build.gradle.kts
:
plugins {
kotlin("jvm") version Kotlin.version
}