在Gradle中多次调用Zip任务

opt*_*lic 4 gradle

我需要更新9个zip文件,并且执行它的代码大约是15行.我宁愿不必在构建脚本中使用不同的变量名重复相同的15行9次.

是否可以从另一个任务循环调用Zip任务?

使用动态任务似乎是一种方式,但它需要我列出两次任务数组,我可以看到在将来添加额外项目时会导致错误.

[war1, war2, war3, war4, war5, war6, war7, war8, war9].each { warName ->
    task "task$warName"(type: Zip) {
        archiveName = "${warName}.war"          
        //etc etc
    }
}
task all(dependsOn: [taskwar1, taskwar2, taskwar3, taskwar4, taskwar5, taskwar6, taskwar7, taskwar8, taskwar9]) {

}
Run Code Online (Sandbox Code Playgroud)

还有其他选择吗?

Opa*_*pal 6

所有代码的第一个可能简化为:

task allWars

(1..9).each { id ->
   task "taskwar${id}"(type: Zip) {
      archiveName = "war${id}.war"
   } 
   allWars.dependsOn "taskwar${id}"
}
Run Code Online (Sandbox Code Playgroud)

以及具有任务规则的解决方案:

tasks.addRule('Pattern: taskwar<ID>') { String taskName ->
    if (taskName.startsWith('taskwar')) {
        task(taskName, type: Zip) {
            archiveName = "${taskName - 'task'}.war"
        }
    }
}

task allWars {
   dependsOn << (1..9).collect { "taskwar$it" }
}
Run Code Online (Sandbox Code Playgroud)

在功能方面,几乎没有明显的优缺点.基本上没有规则的解决方案会更短,因为你可以看到,所以如果你代表态度,那么代码越少越好.但是,在这种情况下,任务规则是在gradle中创建的 - 其中有许多预定义的任务.第一种解决方案更加时髦,而第二种解决方案更加渐进 ;)