Gradle聚合任务 [英] Gradle aggregation task
问题描述
在我的gradle脚本中,我构建了一个运行java进程的任务。这个过程取决于目标属性。任务定义如下:
$ b
In my gradle scripts, I've built a task that runs a java process. This process depends on a target property. The task is defined by:
task('bulk', type: JavaExec, dependsOn: 'classes', description : 'Bulk data import on a target (defined by -Ptarget=[event|member|...]]') {
//available imports
ext{
event = relativePath('src/main/scripts/events.csv')
member = relativePath('src/main/scripts/member.csv')
membership = relativePath('src/main/scripts/membership.csv')
}
//check the target is set
doFirst {
if(!project.hasProperty('target')){
println "\nUsage:"
println "\tgradle bulk -Ptarget=[event|member|...]"
println "where target is : "
bulk.ext.each{ println it }
throw new GradleException('Target argument required')
} else {
println "\nBulk import of $target\n"
}
}
main = 'org.yajug.users.bulkimport.BulkImport'
classpath = sourceSets.main.runtimeClasspath
if(project.hasProperty('target')){
bulk{
args target
args bulk.ext[target]
debug false
}
}
}
并运行它:
gradle bulk -Ptarget=event
它工作正常,但知道我必须针对不同的目标运行此过程:
It's working fine, but know I have to run this process for different targets:
gradle bulk -Ptarget=event
gradle bulk -Ptarget=member
gradle bulk -Ptarget=membership
...
如何将所有这些呼叫分组到另一个任务与gradle的依赖模型?(我知道目标列表)
解决方案
SOLUTION
task bulk;
['event','member','membership'].each {target ->
task("bulk${target}", type: JavaExec, dependsOn: 'classes', description : "Bulk data import of ${target}s") {
//available imports
ext{
event = relativePath('src/main/scripts/events.csv')
member = relativePath('src/main/scripts/member.csv')
membership = relativePath('src/main/scripts/membership.csv')
}
//check the target is set
doFirst {
println "\nBulk import of $target\n"
}
main = 'org.yajug.users.bulkimport.BulkImport'
classpath = sourceSets.main.runtimeClasspath
args target
args ext[target]
debug false
}
bulk.dependsOn("bulk${target}")
}
推荐答案
如何将所有这些用这个方法调用另一个单独的任务gradle的依赖模型?
How can I group all these calls into an other single task with the gradle's dependency model ?
你不能这样做,因为任务(实例)每次构建最多只能执行一次。相反,要走的路是声明多个任务实例。您可以通过将任务声明放入循环中,将其放入方法并多次调用,或通过编写任务类并多次实例化来实现此目的。然后,您将添加一个依赖于所有批量
任务的其他任务。假设 bulk
任务之间的执行顺序不相关,就是这样。
You can't, because a task (instance) will be executed at most once per build. Instead, the way to go is to declare multiple task instances. You could do this by putting the task declaration in a loop, putting it in a method and calling it multiple times, or by writing a task class and instantiating it multiple times. Then you'll add one other task that depends on all bulk
tasks. Assuming the execution order between bulk
tasks is irrelevant, that's it.
通过添加一两个辅助方法,可以在此创建一个漂亮的小API,以提高可读性并允许在其他地方重复使用。
By adding a helper method or two, you can create a nice little API around this, to improve readability and allow reuse in other places.
解决此问题的另一种方法是使用规则。您可以在 Gradle用户指南中阅读有关任务规则的更多信息。
Another way to tackle this is with a task rule. You can read more on task rules in the Gradle User Guide.
这篇关于Gradle聚合任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!