1

在 Gradle Groovy DSL 中,您可以按照Gradle 用户手册中的说明轻松地将依赖模块替换为兼容的替代品。你如何在 Gradle Kotlin DSL 中做同样的事情?

4

2 回答 2

2

TLDR

Gradle Kotlin DSL 中的Gradle 文档示例

configurations.forEach({c: Configuration ->
    println("Inside 'configurations.forEach'")

    val replaceGroovyAll: DependencyResolveDetails.() -> Unit = {
        println("Inside 'replaceGroovyAll'")
        if (requested.name == "groovy-all") {
            val targetUsed = "${requested.group}:groovy:${requested.version}"
            println("Replacing 'groovy-all' with $targetUsed")
            useTarget(targetUsed)
            because("prefer 'groovy' over 'groovy-all'")
        }
        if (requested.name == "log4j") {
            val targetUsed = "org.slf4j:log4j-over-slf4j:1.7.10"
            println("replacing 'log4j' with $targetUsed")
            useTarget(targetUsed)
            because("prefer 'log4j-over-slf4j' 1.7.10 over any version of 'log4j'")
        }
    }
    c.resolutionStrategy.eachDependency(replaceGroovyAll)
})

细节

GradleResolutionStrategy.eachDependency接受 type 的参数Action<? super DependencyResolveDetails>自 0.8.0 版以来, Kotlin Gradle DSL 转换Action带有接收器的 Function 文字。因此,当您需要Action<T>在 Groovy Gradle 脚本中传递一个时,您可以在 Kotlin 中将其定义为

val funcLit: T.() -> Unit = {
    // fields and methods of T are in scope here
}

然后,您可以将 thisfuncLit作为参数传递到任何Action<T>预期的地方。

于 2018-05-28T13:40:48.177 回答
0

我还在项目的 github 上打开了一个问题,由 Github 用户eskatos回答。我编码并执行了他的答案,发现它也有效。这是他的代码。

configurations.all {
    resolutionStrategy.eachDependency {
        if (requested.name == "groovy-all") {
            useTarget("${requested.group}:groovy:${requested.version}")
            because("prefer 'groovy' over 'groovy-all'")
        }
        if (requested.name == "log4j") {
            useTarget("org.slf4j:log4j-over-slf4j:1.7.10")
            because("prefer 'log4j-over-slf4j' 1.7.10 over any version of 'log4j'")
        }
    }
}
于 2018-06-03T19:16:18.630 回答