Gradle Kotlin DSL无法识别buildcript中的ext

时间:2017-08-18 09:53:21

标签: gradle kotlin build.gradle gradle-kotlin-dsl

在这些日子里,我正在尝试编写一些代码来体验Spring 5中的Spring反应特性和kotlin扩展,我还准备了一个gradle Kotlin DSL build.gradle.kt来配置gradle构建。

build.gradle.kthttp://start.spring.io生成的Spring Boot模板代码转换而来。

但Gradle无法检测到ext中的buildscript

buildscript {
  ext { }
}

ext会导致Gradle构建错误。

要使classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion")中的变量生效,我会以艰难的方式添加变量。

val kotlinVersion = "1.1.4"
val springBootVersion = "2.0.0.M3"

但我必须在全球顶级位置声明它们并在buildscript中复制它们。

代码:https://github.com/hantsy/spring-reactive-sample/blob/master/kotlin-gradle/build.gradle.kts

是否有一种优雅的方法让ext有效?

更新:有一些丑陋的方法:

  1. 从Gradle Kotlin DSL示例https://github.com/gradle/kotlin-dsl/tree/master/samples/project-properties,声明gradel.properties中的属性。

    kotlinVersion = 1.1.4
    springBootVersion = 2.0.0.M3
    

    并在build.gradle.kts中使用它。

    buildScript{
       val kotlinVersion by project
    
    }
     val kotlinVersion by project //another declare out of buildscript block.
    
  2. 与上面类似,在buildScript块中声明它们:

    buildScript{
       extra["kotlinVersion"] = "1.1.4"
       extra["springBootVersion"] = "2.0.0.M3"
       val kotlinVersion: String by extra
    
    }
     val kotlinVersion: String by extra//another declare out of buildscript block.
    
  3. 如何避免重复 val kotlinVersion:String by extra

5 个答案:

答案 0 :(得分:10)

Kotlin DSL ext已更改为多余,可以在buildscript下使用。

例如:-

buildscript {
    // Define versions in a single place
    extra.apply{
        set("minSdkVersion", 26)
        set("targetSdkVersion", 27)
    }
}

答案 1 :(得分:7)

对我有用的是在ext而不是allprojects中使用buildscript,因此在您的顶级build.gradle.kts

allprojects {
  ext {
    set("supportLibraryVersion", "26.0.1")
  }
}

然后您可以在build.gradle.kts文件中使用它,如下所示:

val supportLibraryVersion = ext.get("supportLibraryVersion") as String

答案 2 :(得分:5)

可以使用.kt文件中.gradle.kts文件中定义的常量。

在项目的根文件夹中创建buildSrc文件夹

创建包含以下内容的buildSrc/build.gradle.kts文件

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

创建具有以下内容的文件buildSrc/src/main/kotlin/Constants.kt

object Constants {
    const val kotlinVersion = "1.3.70"
    const val targetSdkVersion = 28
}

同步。现在,您可以在像这样的各种.gradle.kts文件中引用创建的常量

...
classpath(kotlin("gradle-plugin", version = Constants.kotlinVersion))
...

...
targetSdkVersion(Constants.targetSdkVersion)
...

答案 3 :(得分:3)

kotlin-gradle-dsl中的全局属性:
https://stackoverflow.com/a/53594357/3557894


kotlin版本已嵌入kotlin-gradle-dsl。
可以将嵌入式版本的依赖项使用如下:

implementation(embeddedKotlin("stdlib-jdk7"))

classpath(embeddedKotlin("gradle-plugin"))

答案 4 :(得分:1)

我们可以使用Kotlin的一种新可能性:

object DependencyVersions {
    const val JETTY_VERSION = "9.4.12.v20180830"
}

dependencies{
    implementation("org.eclipse.jetty:jettyserver:${DependencyVersions.JETTY_VERSION}")
}

在这里,DependencyVersions是我选择的名称。您可以选择其他名称, 例如“ MyProjectVariables”。这是避免使用extra或ext属性的方法。