Gradle - 捕获基于每个任务写入out / err的输出

时间:2015-07-20 17:54:21

标签: gradle

我尝试捕获每个任务执行时写入的输出。当使用--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)
    }
}

我是否搞砸了上面代码中的某些内容,还是应该将其报告为错误?

1 个答案:

答案 0 :(得分:1)

看起来每个LoggingManager个实例共享OutputLevelRenderer,这是您的听众最终添加的内容。这确实让我想知道为什么你没有收到重复的消息,因为你一遍又一遍地将相同的监听器附加到同一个渲染器。但似乎神奇的是BroadcastDispatch,它将侦听器保存在地图中,由侦听器对象本身键入。所以你不能有重复的听众。

请注意,为了保持这一点,每个监听器的哈希码必须相同,这似乎令人惊讶。无论如何,也许这是按预期工作,也许不是。对于Gradle是否应该支持每个任务的监听器来说,确实值得一个问题。或者在dev邮件列表上提出它。