如何将 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 如果夹板抱怨任何问题,则构建。
所以我试图解决这里的几个问题:
- 如何在适当的阶段从 Gradle 调用夹板?例如,每当 CodeNarc 执行时(编译后?运行 测试后?)很可能应该调用 splint。
- 如何通过此调用将正确的命令行参数传递给夹板?
- 如何挂钩 splint 的控制台输出?
- 当控制台输出包含某些关键字时如何使构建失败?
迄今为止我最好的尝试是:
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% 确信我的 workingDir
和 commandLine
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!"
}
}
虽然这个问题涉及到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 如果夹板抱怨任何问题,则构建。
所以我试图解决这里的几个问题:
- 如何在适当的阶段从 Gradle 调用夹板?例如,每当 CodeNarc 执行时(编译后?运行 测试后?)很可能应该调用 splint。
- 如何通过此调用将正确的命令行参数传递给夹板?
- 如何挂钩 splint 的控制台输出?
- 当控制台输出包含某些关键字时如何使构建失败?
迄今为止我最好的尝试是:
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% 确信我的 workingDir
和 commandLine
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!"
}
}