我有一个执行命令的Exec任务(Inkscape,处于“no-gui”模式)。该命令的噪音令人难以置信,并且会向stderr发出很多不重要的警告。但是,它发送给stderr的某些东西很有用,所以我不想完全抑制它的stderr。
目前,我有一个包装器 shell 程序脚本,该脚本使用grep -v
从stderr中过滤出我知道毫无意义的消息。然后,让我的Exec任务调用此脚本。
我想知道是否有办法使它更加独立,这样我就不必依靠外部的shell脚本了。
我的gradle任务看起来像这样:
task createIcon(type:Exec) {
def outdir = new File(fromSvgDir, "drawable-ldpi/")
outputs.dir(outdir)
doFirst {
outdir.mkdirs()
}
def svg = 'src/images/ic_launcher.svg'
inputs.source(new File(svg))
def png = new File(outdir, "ic_launcher.png")
outputs.file(png)
commandLine "$workingDir/svgToPng.sh", svg, png
}
和
svgToPng.sh
看起来像这样:#!/bin/bash
svg="$1"
png="$2"
exec inkscape -z -D -w 48 -e "$png" "$svg" 2> >(
grep -v '^\*\* (inkscape:[0-9]*): CRITICAL \*\*: dbus_g_' |
grep -v '^$' |
grep -v '^Failed to get connection$' >&2
)
(是的,不管您是否相信,这些“关键”错误都是无关紧要的,尽管有这些错误,Inkscape实际上还是成功地完成了应该做的事情。)
最佳答案
我还没有测试过,但是可能会有一些变化:
task createIcon << {
def os = new ByteArrayOutputStream()
def result = exec {
def outdir = new File(fromSvgDir, "drawable-ldpi/")
outputs.dir(outdir)
doFirst {
outdir.mkdirs()
}
def svg = 'src/images/ic_launcher.svg'
inputs.source(new File(svg))
def png = new File(outdir, "ic_launcher.png")
outputs.file(png)
commandLine "$workingDir/svgToPng.sh", svg, png
standardOutput = os
}
def outputAsString = os.toString()
def match = outputAsString =~ /somepattern/
println match
}
您还可以根据某些匹配项,通过引发异常来停止构建
throw new GradleException('error occurred')
关于gradle - 有没有一种简单的方法可以在gradle Exec任务中过滤stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269567/