在 Kotlin 中为依赖块创建一个 Gradle 函数

Create a Gradle function for dependencies block in Kotlin

目前,我正在创建一个函数,可用于 Groovy 中的 dependencies 块:

project.dependencies.ext.foo = { String value ->
    project.files(extension.getFooDependency(project).jarFiles).asFileTree
}

多亏了它,我能够做到:

afterEvaluate {
    dependencies {
        compileOnly foo('junit')
    } 
}

我正在将 Groovy 代码转换为 Kotlin,我想知道如何重写这个 foo 扩展。 我最终得到了:

project.dependencies.extensions.extraProperties.set("foo", Action { value: String ->
    project.files(extension.getIdeaDependency(project).jarFiles).asFileTree
})

调用 foo('junit') 后,出现以下异常:

> Could not find method foo() for arguments [junit] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

我认为这在 Kotlin DSL 中的工作方式不同。相反,您可以在项目的某处声明一个 Kotlin 扩展函数。然后调用它会包括所有必要的接收者。

对于多个项目,我建议使用 buildSrc 项目。下面的所有项目文件都可以看到那里的声明。

谈到 Groovy 和 Kotlin 支持,我会做这样的事情:

private fun getFooImpl(scope: getFooImpl, name: String) { /*here is the implementation */ }

fun DependencyHandlerScope.getFoo(name:String) = getFooImpl(this, name)

//in Groovy
project.dependencies.extensions.extraProperties.set("foo", {getFooImpl(..)})

相同的代码也可以放入插件中。一种更通用的方法可能是注册一个 custom DLS extension,这样就可以在 Gradle DSL 中允许自定义块 thisIsMyPlugin { .. } 并在扩展 class 中定义所有必要的辅助函数.这里的缺点是迫使用户将他们的代码包装到 thisIsMyPlugin 块中。