Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle Kotlin DSL无法识别buildscript中的ext_Gradle_Kotlin_Build.gradle_Gradle Kotlin Dsl - Fatal编程技术网

Gradle Kotlin DSL无法识别buildscript中的ext

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

在这些日子里,我试图编写一些代码来体验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 gradle plugin:$kotlinVersion”)
编译(“org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion”)
中的变量起作用,我艰难地添加了变量

val kotlinVersion = "1.1.4"
val springBootVersion = "2.0.0.M3"
但我必须在全局顶级位置声明它们,并在
buildscript
中复制它们

代码:

是否有一种优雅的方法使
ext
工作

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

  • 从Gradle Kotlin DSL示例中,在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

    对我有效的方法是在
    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插件。:)