2017-05-03 102 views
0

我想在根項目中創建一個任務,這樣當任務執行時,它將在子項目中執行同名任務,只爲具有該名稱的任務的子項目執行。如何創建遞歸Gradle任務?

我不想硬編碼任務的名稱,因爲以後可能會添加更多的子項目。

task checkArtifacts 
subprojects.findAll { subproject -> 
    subproject.getTasksByName('checkArtifacts', false) 
}.forEach { task -> 
    checkArtifacts.dependsOn(task) 
} 

不起作用,因爲它看起來像它迫使配置階段結束,打破一些插件,使配置階段的變化。

task checkArtifacts 
afterEvaluate { 
    subprojects.findAll { subproject -> 
    subproject.getTasksByName('checkArtifacts', false) 
    }.forEach { task -> 
    checkArtifacts.dependsOn(task) 
    } 
} 

發出Could not determine the dependencies of task ':checkArtifacts'.

回答

1

有在DomainObjectCollection一些方法被應用到將來的更新集合。

all

執行對這個集合中的所有對象給出封閉,任何物體隨後添加到此集合。該對象作爲閉包代理傳遞給閉包。或者,它也作爲參數傳遞。

而且matching

返回一個包含此集合滿足給定的關閉規範中的對象的集合。返回的集合是實時的,因此當匹配對象添加到此集合時,它們也在過濾的集合中可見。

因此,像

subprojects { 
    tasks.matching { it.name == 'checkArtifacts' }.all { task -> 
     rootProject.tasks.checkArtifacts.dependsOn task 
    } 
} 
1

你確定你需要在根所有定義的這個任務?如果你只是在根上調用任務「checkArtifacts」,它會爲每個已定義的子項目運行它。沒有必要完成額外的任務。

如果你需要做的,我想嘗試更多的東西像這樣使用TaskContainer

task checkArtifacts 

subprojects { 
    tasks.whenTaskAdded { task -> 
     if (task.name == 'checkArtifacts') { 
      rootProject.tasks.checkArtifacts.dependsOn task 
     } 
    } 
} 
+0

是的,這是事實。我忘了提及我想要另一個rootProject任務依賴於這個任務。 –