Ссылка на переменную kotlin gradle в блоке плагинов - PullRequest
0 голосов
/ 05 июня 2018

Я уже некоторое время пишу плагины Gradle на нескольких языках, используя их обычный сценарий сборки Groovy DSL.В последнее время я хотел узнать, как использовать их DSL-скрипт сборки Kotlin, но я не могу понять некоторые вещи.

У меня есть пример ниже:

val kotlin_version = "1.2.41"

plugins {
    application
    kotlin("jvm").version(kotlin_version)
}

application {
    mainClassName = "samples.HelloWorldKt"
}

dependencies {
    compile(kotlin("stdlib"))
}

repositories {
    jcenter()
}

Однако, когда я запускаю простую задачу, такую ​​как «очистить», я получаю следующую ошибку:

* What went wrong:
Script compilation error:

  Line 5:     kotlin("jvm") version kotlin_version
                                    ^ Unresolved reference: kotlin_version

Однако, если я заменю kotlin_version на строковый литерал, он будет работать нормально:

val kotlin_version = "1.2.41"

plugins {
    application
//    kotlin("jvm").version(kotlin_version)
    kotlin("jvm").version("1.2.41")
}

application {
    mainClassName = "samples.HelloWorldKt"
}

dependencies {
    compile(kotlin("stdlib"))
}

repositories {
    jcenter()
}

Однако, если я параметризирую блок dependencies с моим kotlin_version, он прекрасно работает:

dependencies {
    compile(kotlin("stdlib", kotlin_version))
}

Почему нельзя ссылаться на переменные внутри блока plugins?

1 Ответ

0 голосов
/ 06 июня 2018

См. Документацию: https://docs.gradle.org/current/userguide/plugins.html#sec:constrained_syntax В основном, это говорит о том, что версия плагина должна быть постоянной, литеральной, строковой.

Это достигается с помощью DslMaker: https://kotlinlang.org/docs/reference/type-safe-builders.html#scope-control-dslmarker-since-11

Если выЕсли вы хотите использовать переменную в другом месте, вы можете использовать это:

buildscript {
    var kotlinVersion: String by extra
    kotlinVersion = "1.2.41"

    repositories {
        jcenter()
    }

    dependencies {
        classpath(kotlin("gradle-plugin", kotlinVersion))
    }
}

plugins {
    application
}

application {
    mainClassName = "samples.HelloWorldKt"
}

apply {
    plugin("kotlin")
    plugin("application")
}

val kotlinVersion: String by extra

repositories {
    jcenter()
}

dependencies {
    compile(kotlin("stdlib-jdk8", kotlinVersion))
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

Если вам это не нужно, вы можете просто встроить содержимое переменной kotlin_version

...