Grandle Kotlin DSL 无法识别构建脚本中的 ext

最近,我正在尝试编写一些代码来体验 Spring 5中的反应特性和 Kotlin 扩展,我还准备了 gradle Kotlin DSL build.gradle.kt 来配置 gradle build。

build.gradle.kt是从由 http://start.spring.io生成的 Spring Boot 模板代码转换而来的。

但是,在 buildscript中的 ext不能被 GRADLE 检测到。

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. Similar with above declare them in buildScript block:

    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.
    

How can I avoid the duplication of val kotlinVersion: String by extra?

35635 次浏览

我的工作是使用 extallprojects而不是 buildscript,所以在你的顶级 build.gradle.kts

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

然后你可以像下面这样在 build.gradle.kts文件中使用它:

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

Kotlin-gradle-dsl 中的整体性质:
Https://stackoverflow.com/a/53594357/3557894


Kotlin 版本嵌入到 Kotlin-gradle-dsl 中。
可以使用嵌入式版本的依赖项如下:

implementation(embeddedKotlin("stdlib-jdk7"))


classpath(embeddedKotlin("gradle-plugin"))

对于 Kotlin DSL ext,已经将其更改为额外的,并且可以在 buildscript 下使用。

例句:-

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

对于 Kotlin,我们可以利用一种新的可能性:

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


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

在这里,DependencyVersions 是我选择的名称。您可以选择其他名称, 这是一种避免使用额外属性或 ext 属性的方法。

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

在项目的根文件夹中创建 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)
...

在 gradle.properties 中定义全局属性是可能的:

xyzVersion=1.0.0

然后在模块的 build.gradle.kts 中使用它们:

val xyzVersion: String by project

这些答案我都不清楚。 我的解释是:

/build.gradle.kts :

buildscript {
extra.apply {
set("compose_version", "1.0.3")
}
...
}

/app/build.gradle.kts :

val composeVersion = rootProject.extra["compose_version"]
implementation("androidx.compose.ui:ui:$composeVersion")
implementation("androidx.compose.material:material:$composeVersion")
val junitVersion by extra("4.13.2")
testImplementation("junit:junit:$junitVersion")

在 Kotlin,做到这一点的方法是使用 by extraext块。

by extra:

val kotlinVersion = "95" by extra
val kotlinCompiler = true by extra

ext:

ext {
set("kotlinVersion", "95")
set("kotlinCompiler", true)
}