在这些日子里,我正在尝试编写一些代码来体验Spring 5中的Spring反应特性和kotlin扩展,我还准备了一个gradle Kotlin DSL build.gradle.kt来配置gradle构建。
build.gradle.kt
由http://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
有效?
更新:有一些丑陋的方法:
从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.
与上面类似,在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.
如何避免重复 val kotlinVersion:String by extra ?
答案 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属性的方法。