有没有一种简单的方法来过滤grader Exec任务中的stderr?

时间:2016-03-28 19:25:07

标签: gradle groovy

我有一个运行命令的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实际上成功地做了它应该做的事情,尽管它们应该做。)

1 个答案:

答案 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')