Gradle聚合任务 [英] Gradle aggregation task

查看:170
本文介绍了Gradle聚合任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆