【问题标题】:Gradle Script Kotlin and dependencyManagementGradle Script Kotlin 和 dependencyManagement
【发布时间】:2017-04-10 15:55:17
【问题描述】:

我正在尝试将 Spring Cloud Stream 应用程序构建脚本移植到 Kotlin。到目前为止,一切都很好,除了依赖管理块。在网上很难找到任何东西。示例也不涵盖该主题。

如何将以下块转换为build.gradle.kts?谢谢。

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Camden.SR2"
    }
}

【问题讨论】:

    标签: spring gradle kotlin build-script


    【解决方案1】:

    完全没有经过测试,但我认为应该是这样的:

    import io.spring.gradle.dependencymanagement.DependencyManagementExtension
    import io.spring.gradle.dependencymanagement.ImportsHandler
    
    configure<DependencyManagementExtension> {
        imports(delegateClosureOf<ImportsHandler> {
            mavenBom("org.springframework.cloud:spring-cloud-dependencies:Camden.SR2")
        })
    }
    

    如果你没见过,你应该熟悉gradle script kotlin的project extensionsgroovy interop函数。您确实必须深入研究您正在配置的 groovy 插件的源代码,以了解它期望如何使用闭包。 gradle script kotlin 项目中的例子也是很好的指导。

    2016 年 12 月 19 日编辑

    最新版本的依赖管理插件是now more gradle script kotlin friendly,将允许:

    configure<DependencyManagementExtension> {
        imports {
            it.mavenBom("io.spring.platform:platform-bom:Camden.SR2")
        }
    }
    

    它仍然可以从一些 Kotlin 扩展函数中受益,以消除对 it 的需要(使用接收器代替),但绝对是一个改进!

    2017 年 11 月 3 日编辑

    它现在可以在没有it 的情况下工作,如下所示:

    configure<DependencyManagementExtension> {
        imports {
            mavenBom("io.spring.platform:platform-bom:Camden.SR2")
        }
    }
    

    【讨论】:

    • 对于未经测试的解决方案非常有效。谢谢你。 ;) 不幸的是,我只是 Kotlin 新手。但是感谢您的提示,我会更好地查看代码。
    • 不用担心。我确信当 Gradle Script Kotlin 更加成熟时,Spring 指南/示例将很快更新。虽然更好的解决方案是让 Spring 提供一些扩展功能以使 DSL 更友好一些(不需要delegateClosureOf())。例如fun DependencyManagementExtension.imports(imports: DependencyManagementHandler.() -&gt; Unit){ ...}
    【解决方案2】:

    使用最新的io.spring.dependency-management:1.0.6.RELEASE 下面更简单的 sn-p 也可以。

    plugins {
        id("io.spring.dependency-management") version "1.0.6.RELEASE"
    }
    
    dependencyManagement {
        val springCloudVersion = "Finchley.SR2"
        imports {
            mavenBom("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
        }
    }
    

    【讨论】:

      【解决方案3】:

      Gradle 支持通过 platform 功能在 Groovy 和 Kotlin DSL 的 dependency 块中导入 BOM 文件。 platform 可以有多种使用方式,但您通常会看到它被用作控制传递依赖项版本的一种方式,类似于 Maven 中使用 &lt;scope&gt;import&lt;/scope&gt; 的依赖项。

      提供的代码块的翻译是:

      # Kotlin DSL
      dependencies {
          // wrap the BOM coordinates with the "platform" keyword
          implementation platform("org.springframework.cloud:spring-cloud-dependencies:Camden.SR2")
      
          // declare other dependencies
      }
      

      Gradle 可以更进一步,不仅可以建议传递依赖的版本,还可以通过 enforcedPlatform 强制执行版本。

      dependencies {
         implementation enforcedPlatform("org.springframework.cloud:spring-cloud-dependencies:Camden.SR2")
      }
      

      参考资料: https://docs.gradle.org/current/userguide/dependency_management_terminology.html#sub::terminology_platform https://docs.gradle.org/current/userguide/platforms.html#sub:bom_import

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-23
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        相关资源
        最近更新 更多