2015-07-20 43 views
3

我試圖捕獲每個任務執行時寫入的輸出。當使用--max-workers 1運行Gradle時,下面的代碼按預期工作,但是當多個任務並行運行時,以下代碼將從其他同時運行的任務中讀取輸出。Gradle - 捕獲每個任務寫入輸出/ err的輸出

API文檔聲明以下關於任務中的「getLogging」方法。從它所說的我認爲它應該支持捕獲來自單個任務的輸出,而不管同時運行任何其他任務。

getLogging() 返回可用於控制此任務的日誌級別和標準輸出/錯誤捕獲的LoggingManager。 https://docs.gradle.org/current/javadoc/org/gradle/api/Task.html

graph.allTasks.forEach { Task task -> 
    task.ext.capturedOutput = [ ] 

    def listener = { task.capturedOutput << it } as StandardOutputListener 

    task.logging.addStandardErrorListener(listener) 
    task.logging.addStandardOutputListener(listener) 

    task.doLast { 
     task.logging.removeStandardOutputListener(listener) 
     task.logging.removeStandardErrorListener(listener) 
    } 
} 

有我在上面的代碼搞砸的東西,或者我應該報告這個bug?

回答

1

看起來好像每個LoggingManager實例共享一個OutputLevelRenderer,這是您的聽衆最終添加到的內容。這確實讓我想知道爲什麼你沒有得到重複的消息,因爲你一次又一次地將相同的監聽器連接到同一個渲染器。但看起來神奇的是BroadcastDispatch,它使偵聽器保持在一個映射中,並由偵聽器對象本身進行鍵控。所以你不能有重複的聽衆。

請注意,爲了保持這一點,每個監聽器的哈希碼必須相同,這似乎令人驚訝。無論如何,也許這是按照預期工作的,也許事實並非如此。確定Gradle是否應該支持每個任務的聽衆,這當然值得一提。或者在開發郵件列表中提出。