我为Gradle编写了一个插件,我需要根据扩展配置创建动态任务。 build.gradle文件中的示例:
exampleext {
t1 {
}
t2 {
}
}
所以我想创建像sometask#t1和sometask#t2等任务。 我找不到任何信息,我怎么能读这个Closure配置并用它来构建这些任务?它只读取任务,但我想在执行任务之前使用它。 提前谢谢。
答案 0 :(得分:0)
您可以使用Groovy的动态功能:
class ExamplePlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("exampleext", ExampleExt, project)
}
}
class ExampleExt {
Project project
ExampleExt(Project project) {
this.project = project
}
def methodMissing(String name, Object args) {
def configClosure = args ? args[0] : {}
project.tasks.create(name: "sometask#$name", type: Copy, configClosure)
}
}
apply plugin: ExamplePlugin
exampleext {
t1 {
from "src/main/java"
into "$buildDir/tmp/main"
}
t2 {
from "src/test/java"
into "$buildDir/tmp/test"
}
}
您可以查看https://github.com/tschulte/gradle-jnlp-plugin/blob/374360c118e2a7373ee2fa5be7d1b784240bb1aa/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/war/GradleJnlpWarPluginExtension.groovy,其中我允许创建动态任务以及更多嵌套。例如。
jnlpWar {
versions {
"1.0"('org.example:application:1.0:webstart@zip')
}
}
是可以通过
实现的void versions(Closure closure) {
closure.delegate = new Versions()
closure()
}
private class Versions {
@Override
Object invokeMethod(String name, Object args) {
project.configurations.maybeCreate(name)
return project.dependencies.invokeMethod(name, args)
}
}
但是,也许你应该看看孵化的gradle模型(https://docs.gradle.org/current/userguide/software_model.html)。