在 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
块中。
目前,我正在创建一个函数,可用于 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
块中。