我爲Gradle編寫了一個插件,我需要根據擴展配置創建動態任務。從文件的build.gradle實例 :Gradle插件的讀取配置
exampleext {
t1 {
}
t2 {
}
}
所以我想創建一個像sometask#t1和sometask#T2等任務。 我找不到任何信息,我怎麼能讀這個Closure配置並用它來構建這些任務?它只讀任務,但我想在執行任務之前使用它。 在此先感謝。
我爲Gradle編寫了一個插件,我需要根據擴展配置創建動態任務。從文件的build.gradle實例 :Gradle插件的讀取配置
exampleext {
t1 {
}
t2 {
}
}
所以我想創建一個像sometask#t1和sometask#T2等任務。 我找不到任何信息,我怎麼能讀這個Closure配置並用它來構建這些任務?它只讀任務,但我想在執行任務之前使用它。 在此先感謝。
你可以使用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:[email protected]')
}
}
由
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)。