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