在插件块中引用kotlin gradle脚本变量

在插件块中引用kotlin gradle脚本变量,gradle,kotlin,gradle-kotlin-dsl,Gradle,Kotlin,Gradle Kotlin Dsl,一段时间以来,我一直在使用常用的Groovy构建脚本DSL用几种语言编写Gradle插件。最近我想学习如何使用他们的Kotlin构建脚本DSL,但有些事情我还不太清楚 我举了一个例子: val kotlin_version = "1.2.41" plugins { application kotlin("jvm").version(kotlin_version) } application { mainClassName = "samples.HelloWorldKt

一段时间以来,我一直在使用常用的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()
}
但是,当我运行一个简单的任务(如“clean”)时,会出现以下错误:

* 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()
}
但是,如果我用我的
kotlin_版本
参数化
依赖项
块,它就可以很好地工作:

dependencies {
    compile(kotlin("stdlib", kotlin_version))
}
为什么不能在
插件
块中引用变量?

参见文档: 基本上,它声明插件版本必须是常量、文本、字符串

它由DslMaker实现:

如果要在其他地方重用变量,可以使用以下方法:

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"
}
buildscript{
var-kotlinVersion:extra{“1.2.41”}的字符串
存储库{
jcenter()
}
依赖关系{
类路径(kotlin(“gradle插件”,kotlin))
}
}
插件{
应用
}
应用{
mainClassName=“samples.HelloWorldKt”
}
申请{
插件(“kotlin”)
插件(“应用程序”)
}
val kotlinVersion:通过额外的字符串
存储库{
jcenter()
}
依赖关系{
编译(kotlin(“stdlib-jdk8”,kotlinVersion))
}
tasks.withType{
kotlinOptions.jvmTarget=“1.8”
}
如果不需要,您可以简单地内联变量
kotlin\u version