1

虽然这个问题涉及 C 语言、Gradle C 插件和一个名为slint的老式C 静态分析器,我相信任何了解如何将 Gradle 构建连接到可执行进程的 Gradle 大师都可以回答这个问题。

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

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

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

夹板输出到控制台,不幸的是没有其他地方。所以我想看看我是否可以“挂钩”这个控制台输出,检查某些关键字(“错误”,“警告”等),如果夹板抱怨任何事情,则失败/停止构建。

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

  • 如何在适当的阶段从 Gradle 调用夹板?例如,每当 CodeNarc 执行时(编译后?运行测试后?)都可能在应该调用夹板的时候。
  • 如何通过此调用将正确的命令行参数传递给夹板?
  • 如何挂钩夹板的控制台输出?
  • 当控制台输出包含某些关键字时如何使构建失败?

到目前为止,我最好的尝试是:

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% 确信 myworkingDircommandLineargs 不正确,我不确定如何从该语句内部失败/停止构建if,并且我不确定如何check在编译和测试。

有什么想法吗,Gradle 大师?

4

1 回答 1

1

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!"
    }
}
于 2015-05-08T11:50:49.493 回答