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 の依存関係モデルを使用して他の単一のタスクにグループ化するにはどうすればよいですか?

タスク (インスタンス) はビルドごとに最大 1 回実行されるため、できません。代わりに、複数のタスク インスタンスを宣言する方法があります。これを行うには、タスク宣言をループに入れたり、メソッドに入れて複数回呼び出したり、タスク クラスを記述して複数回インスタンス化したりします。次に、すべてのタスクに依存する別のタスクを 1 つ追加しますbulkbulkタスク間の実行順序は無関係であると仮定すると、それだけです。

ヘルパー メソッドを 1 つまたは 2 つ追加することで、この周りに素敵な小さな API を作成して、読みやすさを改善し、他の場所で再利用できるようにすることができます。

これに取り組むもう 1 つの方法は、タスクルールを使用することです。タスク ルールの詳細については、Gradle ユーザー ガイドを参照してください。

于 2013-01-30T14:31:49.157 に答える
1

を作成-Ptarget=allし、build.gradle ファイルでその特定のケースに対処するのはどうですか。これは次のように実行できます。

['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 に答える