Gradle:task';同时将标准输出到文件和终端

Gradle:task';同时将标准输出到文件和终端,gradle,exec,output,Gradle,Exec,Output,我想将一个构建任务的standardOutput更改为文件,因为它稍后将被另一个任务解析 而且,我希望在终端中同时输出,以查看构建中发生了什么 以下是我将任务的输出更改为文件的方式: task sampleTaskWithOutputToFile(type: Exec) { commandLine 'someCommand', 'param1' doFirst { standardOutput = new FileOutputStream('someFolder

我想将一个构建任务的
standardOutput
更改为文件,因为它稍后将被另一个任务解析

而且,我希望在终端中同时输出,以查看构建中发生了什么

以下是我将任务的输出更改为文件的方式:

task sampleTaskWithOutputToFile(type: Exec) {
    commandLine 'someCommand', 'param1'

    doFirst {
        standardOutput = new FileOutputStream('someFolder/someFile.out')
    }
} 
据我所知,我可以编写自己的
OutputStream
实现,同时输出到文件和标准
System.out
,但我希望使用现有的解决方案

此外,我不能使用unix工具,如
tee
,因为任务可以从任何操作系统(Mac操作系统、某些Linux甚至Windows…)启动


谢谢

阐述Peter N关于TeeOutputStream的评论:

task sampleTaskWithOutputToFile(type: Exec) {
    commandLine 'someCommand', 'param1'

    doFirst {
        standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
            new FileOutputStream("someFolder/someFile.out"), System.out);
    }
}

这里的解决方案适用于任何类型的Gradle
任务
,而不仅仅是
Exec

注意:我提供的所有示例都是build.gradle.kts格式,带有gradle惰性配置语法

在特定情况下,您希望使用内存缓存:

tasks.register(“SampleTaskWithOutputFile”){
命令行(“someCommand”、“param1”)
val taskOutput=StringBuilder()
logging.addStandardOutputListener{taskOutput.append(it)}
多拉斯特{
project.file(“foo.output.txt”).writeText(taskOutput.toString())
}
}
或直接写入文件:

task sampleTaskWithOutputToFile(type: Exec) {
    commandLine 'someCommand', 'param1'

    doFirst {
        standardOutput = new FileOutputStream('someFolder/someFile.out')
    }
} 
tasks.register(“SampleTaskWithOutputFile”){
命令行(“someCommand”、“param1”)
lateinit var taskOutput:java.io.Writer
首先{
taskOutput=project.file(“someFolder/someFile.out”).writer()
}
logging.addStandardOutputListener{taskOutput.append(it)}
多拉斯特{
//警告:如果任务失败,将不会执行此操作,并且文件将保持打开状态。
//内存缓存版本没有此问题。
taskOutput.close()
}
}

作为一个更一般的答案,我们可以考虑一个外部插件注册了一个<代码> Foo任务。

tasks.register(“foo”){
多拉斯特{
println(“警告:某些消息”)
}
}
在项目构建脚本中,可以捕获并处理输出,甚至可以实现“失败警告”模式

tasks.named(“foo”){
val taskOutput=StringBuilder()
logging.addStandardOutputListener{taskOutput.append(it)}
多拉斯特{
//在完成所有其他任务操作后,taskOutput的使用必须在doLast中。
//小心:如果在此之后添加了另一个'doLast{}',则不会考虑其输出。
如果(“警告:”在taskOutput中){
抛出异常(
"""
执行foo时出现问题,请修复。
“.trimIndent()
)
}
}
}

如果您希望从插件或groovy/kotlin/java脚本获得完整的日志,A可能会对您有所帮助。
我正在使用这个类将gradle从我自己的插件记录到一个文件中。
您可以使用这个类(可以从kotlin翻译成另一种语言,因为这并不难):
(示例:gradle.useLogger(文件记录器(project.rootDir,“log.log”)))


一些第三方Java库(例如Apache Commons)有一个
TeeOutputStream
。好的,谢谢,我试试这个!没有“build.gradle.kts格式”;)实际上它叫“Kotlin DSL”@Xerus Um