#kotlin #build.gradle #gradle-kotlin-dsl
#kotlin #build.gradle #gradle-kotlin-dsl
Вопрос:
В build.gradle.kts
файле я включаю этот код в верхнюю строку. Затем я использую KotlinCompilerVesion.ВЕРСИЯ ниже.
import org.jetbrains.kotlin.config.KotlinCompilerVersion
Какой-то код работает нормально, но какой-то код не удался:
Похоже, что только plugins
блок не может включить это import
.
Здесь работает нормально:
dependencies {
Implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
Implementation(kotlin("test", KotlinCompilerVersion.VERSION))
}
Здесь всегда неправильно:
plugins {
id("com.android.application")
kotlin("android")
kotlin("android.extensions")
/*
* Error: Unresolved reference: KotlinCompilerVersion
*/
id("kotlinx-serialization") version KotlinCompilerVersion.VERSION
/*
* Error: Unresolved reference: KotlinCompilerVersion
*/
id("kotlinx-serialization") version "$KotlinCompilerVersion.VERSION"
/*
* Error: Unresolved reference: KotlinCompilerVersion
*/
id("kotlinx-serialization") version "${KotlinCompilerVersion.VERSION}"
}
Как я могу правильно использовать его здесь, не объявляя ext.xxxVersion
var?
Комментарии:
1. Я попробовал, и
plugins
область видимости кажется очень строгой, вы все равно можете использовать полное имя для ссылки на значение, даже привязать его к переменной внутри него, но любой импорт, похоже, игнорируется. На самом деле вы получаете странное предупреждение, если пытаетесь установитьval
ВЕРСИЮ вне области видимости и пытаетесь ссылаться на нее внутри.
Ответ №1:
Да, синтаксис 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
}