2015-07-20 41 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是否应该支持每个任务的听众,这当然值得一提。或者在开发邮件列表中提出。