gradle - 有没有一种简单的方法可以在gradle Exec任务中过滤stderr?

标签 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实际上还是成功地完成了应该做的事情。)

最佳答案

我还没有测试过,但是可能会有一些变化:

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/

相关文章:

logging - 转发来自测试的公共(public)日志记录消息

intellij-idea - Jenkinsfile DSL 源代码

groovy - 如何重构常见的Jenkins JobDSL代码?

groovy - 如何在Groovy中以编程方式更改Groovy/Gradle文件?

grails - 在 log4j 附加程序内的 config.groovy 中访问 session 用户

java - 如何将字符串转换为一段代码(工厂方法模式?)

java - Heroku 部署失败,Java Dropwizard 项目使用 Gradle

Android Studio,不匹配支持库版本错误,但不知道它在哪里指定

java - Gradle bndProjectBuilder 测试

android - 从 'com.android.tools.build:gradle:2.3.3'转换为3.0.1后,无法将索引1的值转换为维度:type = 0x1d