我可以停止杀死 Gradle 任务的 javaexec 失败吗?
Can I Stop a javaexec Failure Killing a Gradle Task?
我有一个 gradle 任务遍历文件树并对每个匹配的文件进行 javaexec 调用:
task runFeatures {
doLast {
fileTree(dir: 'src/test/resources/features', include:'**/*.feature').each { file ->
javaexec {
main = "cucumber.api.cli.Main"
classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
args = [
...
'--plugin', json:build/reports/cucumber/${file.filename}",
...
file.absolutePath
]
}
generateReportFromJson()
}
}
这样做的原因是 运行 cucumber/geb 使用 GPars 同时进行测试。
作为对 cucumber 的调用,预计这些 javaexec 会 return 错误,而且很明显,测试框架需要响应错误而不是当场死亡。
但据我所知,一旦功能文件 return 是来自 javaexec 的错误代码,gradle 立即终止整个任务(即整个测试 运行 在这种情况下),而不是为任务提供有关如何响应失败的选项。
在这种情况下,如果有一个场景失败,generateReportFromJson()
永远不会被调用。
有一篇post here作者写了一个javaexec的补丁来解决这个问题。那是在 2012 年,但我找不到那个故事的结局,如果有的话。
所以我能看到的唯一绕过它的方法是从 shell 中调用 gradle 子任务并让子任务执行自动执行 like this。但这至少可以说是笨拙的,特别是因为我的代码需要在 Linux 和 Windows.
上都 运行
有什么我遗漏的吗?
Gradle 任务失败时的行为是停止此任务,然后整个构建失败或继续,以防提供命令行选项 --continue
(文档 here).
如果你想为每个文件分别执行javaexec,那么如果一个执行失败,另一个也会尝试执行,那么你必须为每个执行动态定义不同的任务,可能使用task rules.
现在,关于您的以下评论:
generateReportFromJson()
never gets called if there's a single scenario failing.
然后generateReportFromJson()
在doLast
块之外。这意味着它将在 gradle 配置阶段被调用,即在 javaexec
被调用之前,所以我不确定它是否与任务失败有关。
但是,要在任务 runFeatures
之后调用 generateReportFromJson()
,您只需将其移至单独的任务,然后在使用 --continue
时使其依赖于 runFeatures
选项并希望整个构建继续或将新任务定义为 finalizer task thw 并执行新任务而不是 runFeatures
.
您可以使用 ignoreExitValue
属性:
配置 javaexec 不会导致构建失败
javaexec {
...
ignoreExitValue = true
}
我有一个 gradle 任务遍历文件树并对每个匹配的文件进行 javaexec 调用:
task runFeatures {
doLast {
fileTree(dir: 'src/test/resources/features', include:'**/*.feature').each { file ->
javaexec {
main = "cucumber.api.cli.Main"
classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
args = [
...
'--plugin', json:build/reports/cucumber/${file.filename}",
...
file.absolutePath
]
}
generateReportFromJson()
}
}
这样做的原因是 运行 cucumber/geb 使用 GPars 同时进行测试。
作为对 cucumber 的调用,预计这些 javaexec 会 return 错误,而且很明显,测试框架需要响应错误而不是当场死亡。
但据我所知,一旦功能文件 return 是来自 javaexec 的错误代码,gradle 立即终止整个任务(即整个测试 运行 在这种情况下),而不是为任务提供有关如何响应失败的选项。
在这种情况下,如果有一个场景失败,generateReportFromJson()
永远不会被调用。
有一篇post here作者写了一个javaexec的补丁来解决这个问题。那是在 2012 年,但我找不到那个故事的结局,如果有的话。
所以我能看到的唯一绕过它的方法是从 shell 中调用 gradle 子任务并让子任务执行自动执行 like this。但这至少可以说是笨拙的,特别是因为我的代码需要在 Linux 和 Windows.
上都 运行有什么我遗漏的吗?
Gradle 任务失败时的行为是停止此任务,然后整个构建失败或继续,以防提供命令行选项 --continue
(文档 here).
如果你想为每个文件分别执行javaexec,那么如果一个执行失败,另一个也会尝试执行,那么你必须为每个执行动态定义不同的任务,可能使用task rules.
现在,关于您的以下评论:
generateReportFromJson()
never gets called if there's a single scenario failing.
然后generateReportFromJson()
在doLast
块之外。这意味着它将在 gradle 配置阶段被调用,即在 javaexec
被调用之前,所以我不确定它是否与任务失败有关。
但是,要在任务 runFeatures
之后调用 generateReportFromJson()
,您只需将其移至单独的任务,然后在使用 --continue
时使其依赖于 runFeatures
选项并希望整个构建继续或将新任务定义为 finalizer task thw 并执行新任务而不是 runFeatures
.
您可以使用 ignoreExitValue
属性:
javaexec {
...
ignoreExitValue = true
}