在 Gradle 中多次调用 Zip 任务
Call Zip Task Multiple Times In 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]) {
}
还有其他选择吗?
一种方法是将 'war' 名称列表存储在 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}" }) {
}
首先,您的所有代码可能会简化为:
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" }
}
就功能而言,几乎没有明显的优缺点。如您所见,基本上没有规则的解决方案更短,所以如果您代表态度 更少的代码更好 这就是要走的路。然而,任务规则是在 gradle 中为这种情况创建的 - 其中有很多 预定义的 任务。第一个解决方案更多 groovier 而第二个解决方案更多 gradler ;)
我需要更新 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]) {
}
还有其他选择吗?
一种方法是将 'war' 名称列表存储在 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}" }) {
}
首先,您的所有代码可能会简化为:
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" }
}
就功能而言,几乎没有明显的优缺点。如您所见,基本上没有规则的解决方案更短,所以如果您代表态度 更少的代码更好 这就是要走的路。然而,任务规则是在 gradle 中为这种情况创建的 - 其中有很多 预定义的 任务。第一个解决方案更多 groovier 而第二个解决方案更多 gradler ;)