【问题标题】:Gradle - Capturing output written to out / err on a per task basisGradle - 根据每个任务捕获写入 out / err 的输出
【发布时间】:2015-07-20 17:54:20
【问题描述】:

我正在尝试捕获每个任务执行时写入的输出。下面的代码在使用 --max-workers 1 运行 Gradle 时按预期工作,但是当多个任务并行运行时,下面的代码会从同时运行的其他任务中提取输出。

API 文档对 Task 上的“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)
    }
}

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

【问题讨论】:

    标签: gradle


    【解决方案1】:

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

    请注意,为此,每个侦听器的哈希码必须相同,这似乎令人惊讶。无论如何,也许这正在按预期工作,也许不是。明确 Gradle 是否应该支持每个任务的侦听器当然值得一提。或者在开发邮件列表中提出它。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2016-03-04
      • 2010-10-14
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多