2015-01-27 3 views
3

Мне нужно обновить 9 ZIP-файлов, а код для этого - около 15 строк. Я бы предпочел не повторять то же самое 15 строк 9 раз в скрипте сборки только с разными именами переменных.Call Zip Task Multiple Times in Gradle

Можно ли вызвать задачу 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]) { 

} 

Есть альтернативы?

ответ

6

Елки всех кода может быть упрощена просто:

task allWars 

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

И решение с задачей rules:

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" } 
} 

Есть почти нет очевидных плюсов и минусов - когда это приходит к функциональности. В основном решение без правил короче, как вы можете видеть, поэтому, если вы представляете отношение меньше кода лучше вот путь. Однако правила заданий были созданы в градиенте для таких ситуаций - там, где есть много предопределенных задач. Первым решением является более groovier, а второй более gradler;)

+0

На самом деле мои имена не численные, поэтому мне все еще нужен массив, но добавьте параметр dependOn для каждого цикла - это то, что я не знал, что вы могли бы сделать! – opticyclic

+0

С groovy & gradle есть действительно много и много способов достичь желаемой цели. – Opal

+0

Это, безусловно, более чистое и более сжатое решение. Upvoted. –

3

Один из способов - сохранить список имен «войны» в свойстве ext, а затем перебрать его для создания задач и использовать функцию сопоставления для определения зависимостей для задачи all.

// Define the variables here 
ext.warTaskPrefix = "task" 
ext.warNames = ["war1", "war2", "war3", "war4", "war5", "war6", "war7", "war8", "war9"] 

// Define the war task dynamically 
warNames.each { warName -> 
    task "${warTaskPrefix}${warName}"(type: Zip) { 
     archiveName = "${warName}.war"   
     //etc etc 
    } 
} 

// Define the task that depends on all war tasks 
task all(dependsOn: warNames.collect{ warName -> "${warTaskPrefix}${warName}" }) { 

} 
+0

Правила задачи также могут быть путем. – Opal

+0

@ Opal вы можете привести пример использования правил задачи в качестве ответа, а также плюсы и минусы этого ответа. – opticyclic

+0

Спасибо. Я понял, что мне не нужен префикс, который еще больше упрощает его, чтобы не требовать аргумент collect. Я принял @Opal ответ только потому, что у него было два варианта. – opticyclic