我有一个Exec任务,它运行命令(Inkscape,在"no-gui“模式下)。这个命令非常嘈杂,而且往往会向stderr发出许多不重要的警告。但是,它发送给stderr的一些东西是有用的,所以我不想完全抑制它的stderr。
目前,我有一个包装外壳脚本,它使用grep -v过滤来自stderr的消息,我知道这些消息是没有意义的。然后让我的Exec任务调用这个脚本。
不过,我想知道是否有一种方法可以使它更加独立,这样我就不需要依赖外部shell脚本了。
我的分级任务如下所示:
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实际上成功地完成了它应该做的事情,尽管如此。)
发布于 2016-03-28 21:40:45
我还没有对此进行测试,但可能会有一些变化:
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')https://stackoverflow.com/questions/36269567
复制相似问题