3

在我的 gradle 脚本中,我构建了一个运行 java 进程的任务。此过程取决于目标属性。任务定义为:

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

它工作正常,但知道我必须为不同的目标运行这个过程:

gradle bulk -Ptarget=event
gradle bulk -Ptarget=member
gradle bulk -Ptarget=membership
...

如何使用 gradle 的依赖模型将所有这些调用分组到另一个任务中?(我知道目标列表)

解决方案

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

2 回答 2

2

如何使用 gradle 的依赖模型将所有这些调用分组到另一个任务中?

你不能,因为一个任务(实例)将在每个构建中最多执行一次。相反,要走的路是声明多个任务实例。您可以通过将任务声明放入循环中,将其放入方法中并多次调用它,或者通过编写任务类并多次实例化它来做到这一点。然后,您将添加另一项依赖于所有任务的bulk任务。假设bulk任务之间的执行顺序无关紧要,就是这样。

通过添加一两个辅助方法,您可以围绕此创建一个不错的小 API,以提高可读性并允许在其他地方重用。

解决此问题的另一种方法是使用任务规则您可以在Gradle 用户指南中阅读有关任务规则的更多信息。

于 2013-01-30T14:31:49.157 回答
1

在 build.gradle 文件中创建一个-Ptarget=all, 并处理该特定情况怎么样。这可以这样做:

['event','member','membership'].each { t ->
   task("bulk${t}", ...) {
     onlyIf project.hasProperty("target") && (project.getProperty("target").equals(t) || project.getProperty("target").equals("all"))
     args target
     args bulk.ext[target]
     debug false
   }
}
于 2013-01-30T14:30:30.407 回答