我尝试捕获每个任务执行时写入的输出。当使用--max-workers 1运行Gradle时,下面的代码按预期工作,但是当多个任务并行运行时,下面的代码将获取从同时运行的其他任务写入的输出。
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)
}
}
我是否搞砸了上面代码中的某些内容,还是应该将其报告为错误?
答案 0 :(得分:1)
看起来每个LoggingManager
个实例共享OutputLevelRenderer
,这是您的听众最终添加的内容。这确实让我想知道为什么你没有收到重复的消息,因为你一遍又一遍地将相同的监听器附加到同一个渲染器。但似乎神奇的是BroadcastDispatch
,它将侦听器保存在地图中,由侦听器对象本身键入。所以你不能有重复的听众。
请注意,为了保持这一点,每个监听器的哈希码必须相同,这似乎令人惊讶。无论如何,也许这是按预期工作,也许不是。对于Gradle是否应该支持每个任务的监听器来说,确实值得一个问题。或者在dev邮件列表上提出它。