Неразрешенная ссылка: KotlinCompilerVersion в build.gradle.kts

#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
}