我有一个运行命令的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实际上成功地做了它应该做的事情,尽管它们应该做。)
答案 0 :(得分:2)
我没有对此进行过测试,但有些变体可能会有效:
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')