2016-07-26 4 views
2

で実行中に、同じタスクを複数回実行すると、実行時にタスクが順番のGradle

disableMe 
taskAwork 
enableMe 
disableMe 
taskBwork 
enableMe 

で実行されるように、Gradleの

task enableMe() << { 
    println "Enable" 
} 
task disableMe() << { 
    shouldRunAfter 'taskAwork' 
    println "Disable" 
} 

task taskAwork(){ 
    shouldRunAfter 'enableMe' 
    println "do work in A while disabled" 
} 
task taskA(dependsOn: disableMe, taskAwork, enableMe){ 
} 
task taskBwork(){ 
    shouldRunAfter 'enableMe' 
    println "do work in B while disabled" 
} 
task taskB(dependsOn: disableMe, taskBwork, enableMe){ 
} 

task taskC(dependsOn: taskA, taskB){ 
} 

で、次のようないくつかを持っていることが可能ですしかし、現在、disableMeとenableMeは一度しか実行されません。とにかくそこにステータスを設定して、再び実行できるようにします。

私がこれを行うと考えることができる唯一の方法は、タスクを複製することです。

task enableMeA() << { 
    println "Enable" 
} 
task disableMeA() << { 
    shouldRunAfter 'taskAwork' 
    println "Disable" 
} 
task enableMeB() << { 
    println "Enable" 
} 
task disableMeB() << { 
    shouldRunAfter 'taskBwork' 
    println "Disable" 
} 

task taskAwork(){ 
    shouldRunAfter 'enableMeA' 
    println "do work in A while disabled" 
} 
task taskA(dependsOn: disableMeA, taskAwork, enableMeA){ 
} 
task taskBwork(){ 
    shouldRunAfter 'enableMeB' 
    println "do work in B while disabled" 
} 
task taskB(dependsOn: disableMeB, taskBwork, enableMeB){ 
} 

task taskC(dependsOn: taskA, taskB){ 
} 

答えて

1

ようですあなたの場合、あなたの仕事のためにTaskExecutionListenerを実装し、ロジックを実装するにはbeforeExecuteafterExecuteメソッドを使用する必要があります。

これは次のようになります:ここで

task taskAwork() << { 
    println "do work in A while disabled" 
} 
task taskBwork() << { 
    println "do work in B while disabled" 
} 

task doAllWorkTask(dependsOn: [taskAwork, taskBwork]){ 
} 

gradle.taskGraph.addTaskExecutionListener new WorkTasksExecutionListener() 

class WorkTasksExecutionListener implements TaskExecutionListener { 

    @Override 
    void afterExecute(final Task task, final TaskState state) { 
     if (task.name.contains('work')) { 
      println('Enabling smth before execution of work task') 
     } 
    } 

    @Override 
    void beforeExecute(final Task task) { 
     if (task.name.contains('work')) { 
      println('Disabling smth after execution of work task') 
     } 
    } 
} 

を何かをする2つのタスクを、指定されたそれぞれの1の前と後に実行されるようにいくつかの共通loigicを必要としています。この一般的なロジックを実装するには、WorkTasksExecutionListenerを使用してTaskExecutionListenerインターフェイスを実装し、taskGraphにリスナーとして登録します。

WorkTasksExecutionListenerTaskExecutionListenerの2つの方法:beforeExecuteafterExecuteの2つの方法。このメソッドは、各tskの実行の前後に呼び出されているので、実装にはタスクが機能するかどうかをチェックする条件が追加されています。

この場合の出力は次のようになります。

:taskAwork 
Enabling smth after execution of work task 
do work in A while disabled 
Disabling smth before execution of work task 
:taskBwork 
Enabling smth after execution of work task 
do work in B while disabled 
Disabling smth before execution of work task 
:doAllWorkTask 
0

デフォルトでは、Gradleは最新のタスクを実行しません。 タスクは、TaskOutputsプロパティが変更されていない場合、最新のものとみなされます。

あなたが同じ実行中のタスクを複数回実行したい場合、あなたはタスクを再度実行したいときを返します述語を定義するためにupToDateWhenプロパティを使用することができます。

task myTask() { 
    outputs.upToDateWhen {some_condition} 

    // Do some stuff 
}