Gradle Kotlin DSL无法识别buildscript中的ext
在这些日子里,我试图编写一些代码来体验Spring 5中的Spring被动功能和kotlin扩展,我还准备了一个gradle kotlin DSL build.gradle.kt来配置gradle构建Gradle Kotlin DSL无法识别buildscript中的ext,gradle,kotlin,build.gradle,gradle-kotlin-dsl,Gradle,Kotlin,Build.gradle,Gradle Kotlin Dsl,在这些日子里,我试图编写一些代码来体验Spring 5中的Spring被动功能和kotlin扩展,我还准备了一个gradle kotlin DSL build.gradle.kt来配置gradle构建 build.gradle.kt是由生成的Spring引导模板代码转换而来的 但是Gradle无法检测到buildscript中的ext buildscript { ext { } } ext将导致渐变生成错误 为了使classpath(“org.jetbrains.kotlin:kotlin
build.gradle.kt
是由生成的Spring引导模板代码转换而来的
但是Gradle无法检测到buildscript
中的ext
buildscript {
ext { }
}
ext
将导致渐变生成错误
为了使classpath(“org.jetbrains.kotlin:kotlin gradle plugin:$kotlinVersion”)
和编译(“org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion”)
中的变量起作用,我艰难地添加了变量
val kotlinVersion = "1.1.4"
val springBootVersion = "2.0.0.M3"
但我必须在全局顶级位置声明它们,并在buildscript
中复制它们
代码:
是否有一种优雅的方法使ext
工作
更新:有一些丑陋的方法:
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{
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?对我有效的方法是在
allprojects
中使用ext
而不是buildscript
,因此在顶级build.gradle.kts
allprojects {
ext {
set("supportLibraryVersion", "26.0.1")
}
}
然后您可以在如下模块中的build.gradle.kts
文件中使用它:
val supportLibraryVersion = ext.get("supportLibraryVersion") as String
kotlin gradle dsl中的全局属性:
Kotlin版本嵌入到Kotlin gradle dsl中
您可以将依赖项与嵌入版本一起使用,如下所示:
implementation(embeddedKotlin("stdlib-jdk7"))
classpath(embeddedKotlin("gradle-plugin"))
对于Kotlin,DSL ext已更改为extra,可以在buildscript下使用 例如:-
Kotlin有一种新的可能性,我们可以使用:
object DependencyVersions {
const val JETTY_VERSION = "9.4.12.v20180830"
}
dependencies{
implementation("org.eclipse.jetty:jettyserver:${DependencyVersions.JETTY_VERSION}")
}
这里,DependencyVersions是我选择的一个名称。你可以选择另一个名字,
比如“MyProjectVariables”。这是一种避免使用额外或ext属性的方法。可以在
.gradle.kts
文件中使用.kt
文件中定义的常量
kotlinVersion = 1.1.4
springBootVersion = 2.0.0.M3
在项目的根文件夹中创建buildSrc
文件夹
使用以下内容创建buildSrc/build.gradle.kts
文件
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
object Constants {
const val kotlinVersion = "1.3.70"
const val targetSdkVersion = 28
}
创建包含以下内容的文件buildSrc/src/main/kotlin/Constants.kt
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
object Constants {
const val kotlinVersion = "1.3.70"
const val targetSdkVersion = 28
}
同步。现在,您可以在各种.gradle.kts
文件中引用创建的常量,如下所示
...
classpath(kotlin("gradle-plugin", version = Constants.kotlinVersion))
...
...
targetSdkVersion(Constants.targetSdkVersion)
...
我不知道如何避免重复,但你可以加入:
extra[“kotlinVersion”]=“1.1.4”val-kotlinVersion:String by-extra
到val-kotlinVersion:String by-extra(“1.1.4”)
@ClausHolst极好的澄清!或者更简洁一点:val-supportLibraryVersion:String?通过ext
这甚至无法编译。如果我想向extras对象添加函数,这将如何工作?您能否添加一个如何使用该属性的示例?简单的实现(“org.library:library:$myVersion”)
不起作用。不幸的是,它在buildscript中对我不起作用。读取额外属性:val myVersion:String by rootProject.extra
实现(“org.library:library:$myVersion”)
这比使用groovy更简单,即使它真的能工作……更新的方法是添加到插件:kotlin(“jvm”)
和deps:实现(kotlin(“stdlib-jdk8”)
我认为使用伴生对象会更习惯kotlinstyle@MattKerr一点也不,如果你需要一个单例,你应该使用object
你能在子项目中引用它吗?即使是多模块项目,它也能完美地工作,而且不需要在构建脚本中使用难看的代码。太棒了!喜欢这个解决方案,谢谢!你喜欢吗你有没有关于如何将buildSrc作为工件共享以便在独立项目之间重用的建议?只需链接到某个文档就可以了,我只是不知道从哪里开始looking@EmilKantis,抱歉,不知道此类解决方案。请尝试在此处搜索/询问StackOverflow@EmilKantisbuildSrc本质上就像一个Gradle插件,可以自动lly应用于所有子项目,因此您要做的是创建一个Gradle插件。:)