Подстановка модуля зависимостей с совместимой заменой - PullRequest
0 голосов
/ 24 мая 2018

В Gradle Groovy DSL вы можете легко заменить модуль зависимости на совместимую замену , как описано в руководстве пользователя Gradle .Как вы делаете то же самое в Gradle Kotlin DSL?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Я также открыл вопрос на 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'")
        }
    }
}
0 голосов
/ 28 мая 2018

TLDR

Пример из Документы Gradle в Gradle Kotlin DSL

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)
})

Подробности

Gradle's ResolutionStrategy.eachDependency принимает аргумент типаAction<? super DependencyResolveDetails>. Начиная с версии 0.8.0 Kotlin Gradle DSL преобразует Action в Функциональный литерал с приемником .Поэтому, когда вам нужно передать Action<T> в скрипте Groovy Gradle, вы можете определить его в Kotlin как

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

Затем вы можете передать этот funcLit в качестве аргумента, где Action<T>ожидается.

...