2017-08-28 77 views
0

我爲Gradle編寫了一個插件,我需要根據擴展配置創建動態任務。從文件的build.gradle實例 :Gradle插件的讀取配置

exampleext { 
    t1 { 
    } 
    t2 { 
    } 
} 

所以我想創建一個像sometask#t1和sometask#T2等任務。 我找不到任何信息,我怎麼能讀這個Closure配置並用它來構建這些任務?它只讀任務,但我想在執行任務之前使用它。 在此先感謝。

回答

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:[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)。

相關問題