給 tasks 排序

2018-07-01 16:12 更新
任務(wù)的排序功能正在測試和優(yōu)化. 請注意, 這項功能在 Gradle 之后的版本里可能會改變.

在某些情況下, 我們希望能控制任務(wù)的的執(zhí)行順序, 這種控制并不是向上一張那樣去顯示地加入依賴關(guān)系. 最主要的區(qū)別是我們設(shè)定的排序規(guī)則不會影響那些要被執(zhí)行的任務(wù), 只是影響執(zhí)行的順序本身. 好吧, 我知道可能有點抽象.

我們來看看以下幾種有用的場景:

  • 執(zhí)行連續(xù)的任務(wù): eg. 'build' 從來不會在 'clean' 之前執(zhí)行.
  • 在 build 的一開始先運行構(gòu)建確認(rèn) (build validations): eg. 在正式的發(fā)布構(gòu)建前先確認(rèn)我的證書是正確的.
  • 在運行長時間的檢測任務(wù)前先運行快速的檢測任務(wù)來獲得更快的反饋: eg. 單元測試總是應(yīng)該在集成測試之前被執(zhí)行.
  • 一個聚集 (aggregates) 某種特定類型的所有任務(wù)結(jié)果的任務(wù): eg. 測試報告任務(wù) (test report task) 包含了所有測試任務(wù)的運行結(jié)果.

目前, 有 2 種可用的排序規(guī)則: "must run after" 和 "should run after".

當(dāng)你使用 “must run after” 時即意味著 taskB 必須總是在 taskA 之后運行, 無論 taskA 和 taskB 是否將要運行:

taskB.mustRunAfter(taskA)

"should run after" 規(guī)則其實和 "must run after" 很像, 只是沒有那么的嚴(yán)格, 在 2 種情況下它會被忽略:

  1. 使用規(guī)則來闡述一個執(zhí)行的循環(huán).
  2. 當(dāng)并行執(zhí)行并且一個任務(wù)的所有依賴除了 “should run after” 任務(wù)其余都滿足了, 那么這個任務(wù)無論它的 “should run after” 依賴是否執(zhí)行, 它都可以執(zhí)行. (編者: 翻譯待商榷, 提供具體例子)

總之, 當(dāng)要求不是那么嚴(yán)格時, “should run after” 是非常有用的.

即使有目前的這些規(guī)則, 我們?nèi)钥梢詧?zhí)行 taskA 而不管 taskB, 反之亦然.

例子 15.14. 加入 'must run after'

build.gradle

task taskX << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}
taskY.mustRunAfter taskX

gradle -q taskY taskX 的輸出

> gradle -q taskY taskX
taskX
taskY

例子 15.15. 加入 'should run after'

build.gradle

task taskX << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}
taskY.shouldRunAfter taskX

gradle -q taskY taskX 的輸出

> gradle -q taskY taskX
taskX
taskY

在上面的例子里, 我們?nèi)钥梢灾苯訄?zhí)行 taskY 而不去 taskX :

例子 15.16. 任務(wù)排序不影響任務(wù)執(zhí)行

gradle -q taskY 的輸出

> gradle -q taskY
taskY

為了在 2 個任務(wù)間定義 “must run after” 或者 “should run after” 排序, 我們需要使用 Task.mustRunAfter() 和 Task.shouldRunAfter() 方法. 這些方法接收一個任務(wù)的實例, 任務(wù)的名字或者任何 Task.dependsOn()可以接收的輸入.

注意 “B.mustRunAfter(A)” 或者 “B.shouldRunAfter(A)” 并不影響任何任務(wù)間的執(zhí)行依賴:

  • tasks A 和 B 可以被獨立的執(zhí)行. 排序規(guī)則只有當(dāng) 2 個任務(wù)同時執(zhí)行時才會被應(yīng)用.
  • 在運行時加上 --continue, 當(dāng) A 失敗時 B 仍然會執(zhí)行.

之前提到過, “should run after” 規(guī)則在一個執(zhí)行循環(huán)中將被忽略:

例子 15.17. 'should run after' 任務(wù)的忽略

build.gradle

task taskX << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}
task taskZ << {
    println 'taskZ'
}
taskX.dependsOn taskY
taskY.dependsOn taskZ
taskZ.shouldRunAfter taskX

gradle -q taskX 的輸出

> gradle -q taskX
taskZ
taskY
taskX


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號