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>
ожидается.