2012-02-09 12 views
7

gradleビルドスクリプトでdoFirstメソッドの順序はどのように決定されますか?私は2つのdoFirstメソッドを含む次のサンプルスクリプトを持っています。私は、彼らが実行の両方として、彼らは、添加剤であることを理解しますが、これが発生する順序は逆方向になります。Gradle doFirst()実行順序

task initialize 
task depTask(dependsOn: initialize) 

initialize { 
    doFirst { 
     println 'processing doFirst in initialization (configuration)' 
    } 

    println 'processing initialize (configuration)' 
} 

depTask { 
    println 'processing depTask (configuration)' 
} 

depTask << { 
    println 'executing depTask (execution)' 
} 

initialize << { 
    println 'executing initialize (execution)' 
} 

initialize.doFirst { 
    println 'executing doFirst on initialize (execution)' 
} 

このスクリプトの出力は次のようになります。

processing initialize (configuration) 
processing depTask (configuration) 
executing doFirst on initialize (execution) 
processing doFirst in initialization (configuration) 
executing initialize (execution) 
executing depTask (execution) 

最初の「doFirst」機能が定義されています初期化タスクで使用します。 2番目は設定ブロックの外で定義されます。最初のインスタンスが2番目のインスタンスの前に実行されないのはなぜですか?実行の順序は逆になります。構成定義内の最初のものが最初に実行されることを期待していました。これを理解する助けがあれば幸いです。

+0

'println 'は初期化(設定)でdoFirstを処理しています'これはコンフィギュレーションフェーズでは起こりそうにありません。 –

答えて

14

initialize { doFirst { ... } }およびinitialize.doFirst { ... }はまったく同じものです。両方のステートメントは、タスクのアクションリストの先頭にアクションを挿入しています。したがって、後で挿入されるアクション(この場合はスクリプト内でさらに下に)が最初に実行されます。

+1

これはスタックのように機能しますか? (最後のファーストアウト - LIFO)。 – jmq

+0

nm、私はそれをテストしました。正しい方向に私を指してくれてありがとう。 – jmq