2

一段时间以来,我一直在使用他们常用的 Groovy 构建脚本 DSL 以多种语言编写 Gradle 插件。最近我想学习如何使用他们的 Kotlin 构建脚本 DSL,但我不太明白一些事情。

我在下面有一个例子:

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用 my 参数化块kotlin_version,它工作得非常好:

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

为什么不能在plugins块内引用变量?

4

1 回答 1

3

请参阅文档: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 { "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

于 2018-06-05T22:37:29.230 回答