如何将 Gradle 连接到自定义 EXE 并挂钩其控制台输出?

How to connect Gradle to custom EXE and hook its console output?

虽然这个问题涉及到C语言,Gradle C Plugin, and an oldschool C static analyzer called splint,我相信这个问题可以被任何懂得如何将Gradle构建成一个Gradle的高手回答可执行进程。

很简单:我已经在本地配置了splint,用下面的命令行来分析我简单的C项目的源代码:

splint +never-include -retvalint src/derpus/c/*.c

我正在通过 Gradle(C 插件)管理我的项目构建,现在想在构建序列中的适当点(无论是什么)调用静态分析(夹板)。

splint 输出到控制台,不幸的是没有其他地方。所以我想看看我是否可以 "hook" 这个控制台输出,检查某些关键字 ("error", "warning " 等)和 fail/halt 如果夹板抱怨任何问题,则构建。

所以我试图解决这里的几个问题:

迄今为止我最好的尝试是:

task check(type:Exec) {
    commandLine 'cmd', '/c', 'C:/splint-3.1.1/bin/splint.exe', '+never-include', '-retvalint', 'src/derpus/c/*.c'
    standardOutput = new ByteArrayOutputStream()

    doLast {
        String output = standardOutput.toString()
        if(output.contains("error") || output.contains("")) {
            println "Chuggington!"
        } else {
            println "Meeska! Mooseka! Mickey Mouse! Output is: ${output}"
        }
    }
}

这会产生:

Defining custom ▒check▒ task is deprecated when using standard lifecycle plugin has been deprecated and is scheduled to be removed in Gradle 3.0
:checkSplint 3.1.1 --- 12 April 2003

Finished checking --- no warnings

Chuggington!

BUILD SUCCESSFUL

Total time: 3.327 secs

但是我 100% 确信我的 workingDircommandLine args 是不正确的,我不确定我如何 fail/halt 从里面构建 if-语句,我不确定如何 "position" 这个 check 任务在编译和测试之前发生。

任何想法,Gradle 专家?

workingDir 是该工具应该位于的目录 运行 而不是它所在的位置。通常是项目目录。当谈到命令行尝试:

commandLine 'cmd', '/c', 'splint.exe', '+never-include', '-retvalint', 'src/derpus/c/*.c'

在上面的命令中,所有参数都应该用逗号分隔:,.

可以省略赋值运算符=

当谈到解析输出时——它不起作用,因为在闭包中它还没有生成。尝试:

standardOutput = new ByteArrayOutputStream()

doLast {
    String output = standardOutput.toString()
    if(output.contains("error") || output.contains("")) {
        println "Chuggington!"
    } else {
        println "Meeska! Mooseka! Mickey Mouse!"
    }
}