虽然这个问题涉及 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% 确信 myworkingDir
和commandLine
args 不正确,我不确定如何从该语句内部失败/停止构建if
,并且我不确定如何check
在编译和测试。
有什么想法吗,Gradle 大师?