Неразрешенная ссылка: KotlinCompilerVersion в build.gradle.kts - PullRequest
3 голосов
/ 10 апреля 2019

В файле build.gradle.kts я включаю этот код в верхнюю строку.Затем я использую KotlinCompilerVesion.VERSION ниже.

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 Ответ

2 голосов
/ 13 апреля 2019

Да, синтаксис плагинов 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
}
...