2013-02-21 55 views
3

我們正在爲我們非常龐大而複雜的企業應用程序嘗試Gradle。我們正在使用多個項目構建結構,並對Gradle的並行執行功能感到非常興奮。Debug Gradle的並行模式

我們的代碼庫被域層結構是這樣的:

UI模塊(〜20) - >共享UI - >域 - >道 - >框架

依存關係是單向的,並構建發生自下而上。

不幸的是,我們並沒有看到在我們的構建次大的推動作用。它與我們之前用螞蟻得到的結果幾乎相同。

望着任務並行模式幾件事的執行順序看起來不正確的。 我們的期望是,Gradle將在構建核心層時首先按順序運行任務。因此,在它組裝框架,dao,域和共享ui之後,它應該並行執行其他所有操作。

但我們所看到的執行順序是有點像這樣:

framework.assemble - > dao.assemble - > domain.assemble - > shared.ui.assemble - >其他UI modules.assmble(並行) - > war - >其他UI.check + shared.ui.check + dao.check(並行) - > domain.check - > framework.check

瓶頸在運行檢查域和順序框架而不是並行。這兩個模塊對我們來說是最大的模塊,大約有12k個單元測試,他們需要大約4分鐘才能運行。

我們花了很多時間在看的gradle使用任務的依賴性--all併爲這些模塊測試任務是完全獨立的,並沒有什麼應該推遲其執行。

我們想知道,如果這是一個已知的問題或是否有一種方法,使在搖籃一些額外的調試,以獲得更多的洞察力搖籃如何確定並行方式執行順序。任何幫助表示讚賞。

回答

3

作爲搖籃1.4的,並行任務執行是(有意)在幾個方面受到限制。特別是,隨時執行的一組任務不會包含屬於同一項目的兩個任務。這將隨着時間的推移而改善。除了從日誌中獲得的信息外,我不知道有任何調試幫助(例如,使用--debug)。

注意,並行測試執行是一個單獨的特徵。如果您在同一個項目中進行了大量測試,那麼x> 1的test.maxParallelForks = x應該顯示明顯的加速。 x的值最好通過實驗確定。一個好的起點是機器上物理內核的數量(例如Runtime.getRuntime().availableProcessors()/2)。

+0

**特別是,隨時執行的一組任務不會包含屬於同一個項目的兩個任務。** 這是非常有用的信息。那麼,並行模式下項目的任務粒度是多少?檢查被認爲是一個任務或測試或pmd是任務?它在根項目和子項目之間有什麼不同? 不幸的是,對我們來說** maxParallelForks **根本不起作用。我們已經嘗試將其設置爲最小有用值2,並且構建失敗。它很快就會在OSX上遇到「系統中打開的文件過多」錯誤。 – abhi 2013-02-22 01:51:17

+0

任務的粒度總是相同的。所有的'check','test','pmd'都是任務(實際上我認爲它是'pmdMain')。根項目和子項目沒有區別。當然,並行化時要考慮任務圖,但還要強制執行同一項目中沒有兩個任務可以並行運行的限制。你正在使用哪個Gradle版本?如果您遇到'maxParallelForks'問題,請在http://forums.gradle.org上報告。也嘗試增加打開文件的最大數量(應該很容易在* nix上)。 – 2013-02-22 07:11:07