我正在尝试捕获每个任务执行时写入的输出.当使用--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)
}
}
Run Code Online (Sandbox Code Playgroud)
我是否搞砸了上面代码中的某些内容,还是应该将其报告为错误?
看起来每个LoggingManager实例都共享一个OutputLevelRenderer,这就是您的听众最终添加到的内容。这确实让我想知道为什么你没有收到重复的消息,因为你一遍又一遍地将相同的侦听器附加到相同的渲染器。但神奇之处似乎在于BroadcastDispatch,它将侦听器保留在地图中,并由侦听器对象本身设置键控。所以你不能有重复的听众。
请注意,为了保持这一点,每个侦听器的哈希码必须相同,这似乎令人惊讶。无论如何,也许这正在按预期工作,也许不是。弄清楚 Gradle 是否应该支持每个任务的侦听器当然是一个值得讨论的问题。或者在开发邮件列表中提出它。
| 归档时间: |
|
| 查看次数: |
752 次 |
| 最近记录: |