2013-04-25 90 views
6

是它在某種程度上可能執行任務的依賴性時任務將被跳過?在Gradle中跳過依賴執行被禁用的任務嗎?

在下面的例子,我想jar(和jar的依賴關係)如果執行runServerTests當服務器已經在運行被執行以。在這種情況下,服務器將由另一個進程啓動。

apply plugin: 'java' 

task startServerIfNotRunning(dependsOn: jar) { 
    onlyIf { isServerNotRunning() } 
    ... 
} 

task runServerTests(dependsOn: startServerIfNotRunning) { ... } 

我寧願不添加onlyIfjar任務,因爲這總是應該可以根據一個執行其他任務。 jar任務也具有自己的依賴關係。

+1

我不知道答案在這裏,但如果你的服務器依賴於罐子,罐子是過時的,爲什麼你不想要重新啓動服務器?如果罐子是最新的和所有它的依賴是最新的,然後它不花費你太多的時間爲jar任務不執行任何操作... – erdi 2013-04-25 17:26:10

+0

當你這樣做有他的道理,我們確實有很多的子項目,因此即使所有內容都是最新的,也需要大約15-30秒才能完成「重新編譯」。如果可能的話,我想擺脫這個時間。大部分時間服務器將會是最新的。 – 2013-04-26 10:19:36

+0

見http://stackoverflow.com/questions/18624391/how-to-set-onlyif-for-dependencies-of-gradle-task/18877504#18877504 – 2013-09-18 16:28:55

回答

3

爲了獲得所需的行爲,你必須從任務執行圖形中排除的任務,而不是跳過它的執行。您可以-x在命令行用gradle.startParameter.excludedTaskNames << "..."gradle.taskGraph.useFilter { task -> ... }做到這一點或編程。

+0

好,謝謝。我猜這一定是在配置階段完成的? – 2013-04-26 15:26:51

+0

是的。在執行階段,任務執行圖不能再被改變。 – 2013-04-26 18:40:28

+0

@PeterNiederwieser你能否更詳細地解釋或指出你提到的第二種方法的細節? 我無法在相關文檔中找到「userFilter」http://www.gradle.org/docs/current/javadoc/index.html?org/gradle/api/execution/TaskExecutionGraph.html – ZenBalance 2013-07-25 21:06:08

2

你可以做這樣的事情

task startServerIfNotRunning(dependsOn: jar) { 
    if (isServerNotRunning()) { 
     enabled = false; 
     dependsOn = []; 
    } 
} 

if語句我們在配置階段評估和相關任務將被刪除。我已經用代碼和輸出在Skipping Gradle Tasks中總結了這一點。看一看。

+0

然而,這有一個缺點,那就是每次都會在Gradle的配置階段調用'isServerNotRunning()',而不是在執行此任務時。 – 2014-12-31 10:48:01

+1

不,您的示例中的代碼在_configuration階段_中執行,並且在此階段中始終配置所有任務(在當前項目中)。這些任務並不總是執行,但那不是我所說的。我已經在Gradle 2.2.1中驗證了這一點,這是寫作時的最新版本。 – 2015-01-02 20:36:42

+0

你說得對,那是一個缺點。使用舊版本進行驗證。我收回我以前的評論。 – 2015-01-03 05:27:22