2017-03-26 13 views
1

I私はタスク2つの異なる回を再割り当てすることにより、タスク2はタスク1に依存して作られた.sbtファイルにして、単純なタスクはタスク1とタスク2があります。実行中

val task1 = taskKey[String]("task1 original") 
val task2 = taskKey[String]("task2 original") 

task1 := { 
    val log = streams.value.log 
    log.error("task1 original output") 
    "task1 original output" 
} 
task2 := { 
    val log = streams.value.log 
    log.error("task2 original output") 
    "task2 original output" 
} 

task2 := { 
    val log = streams.value.log 
    log.error("task2 chain1 before task1.value") 
    val x = task1.value 
    log.error("task2 chain1 before task2.value") 
    task2.value 
} 

task2 := { 
    val log = streams.value.log 
    log.error("task2 chain2 before task1.value") 
    val x = task1.value 
    log.error("task2 chain2 before task2.value") 
    val y = task2.value 
    log.error("task2 chain2 before task2.value") 
    task2.value 
} 

私は、SBTをロードし、彼らに私を実行すると、次の出力を得る:

> task1 
[error] task1 original output 
[success] Total time: 0 s, completed Mar 26, 2017 1:50:53 PM 
> task2 
[error] task1 original output 
[error] task2 original output 
[error] task2 chain1 before task1.value 
[error] task2 chain1 before task2.value 
[error] task2 chain2 before task1.value 
[error] task2 chain2 before task2.value 
[error] task2 chain2 before task2.value 
[success] Total time: 0 s, completed Mar 26, 2017 1:50:56 PM 

なぜこのように見えますか? task2がより古いtask2割り当てを呼び出し、無限ループを引き起こさないのはなぜですか?

タスクの実行順序はどのくらいですか?ロギング出力は、タスクが実行される実際の順序と一致しない場合があります。タスクの実行順序を記録する信頼できる方法はありますか?

ご協力いただきありがとうございます。

答えて

0

タスクを実行すると、sbtはgraph of task dependenciesを計算します。このグラフでは、各タスクは再帰なしで1回だけ計算されます。ただし、設定またはタスクは、設定またはタスクの以前の値に依存することも可能です。設定またはタスクは、一度だけ計算されます。

タスクの順序は指定されていませんが、他のタスクに依存するタスクは依存関係の後に実行されます。独立したタスクも並行して実行できます。厳密な発注が必要な場合は、別の発注に依存させる必要があります。例えば

task2 := task2.dependsOn(task1)