【发布时间】:2020-08-18 00:18:33
【问题描述】:
在 gradle 中,有什么理由不使用 Groovy 的 .execute() 函数来运行命令行进程?我知道“gradle”的方式是从 Exec 到命令行。但感觉 .execute() 提供了更多的灵活性,例如能够在 doLast 块中使用。
【问题讨论】:
标签: gradle
在 gradle 中,有什么理由不使用 Groovy 的 .execute() 函数来运行命令行进程?我知道“gradle”的方式是从 Exec 到命令行。但感觉 .execute() 提供了更多的灵活性,例如能够在 doLast 块中使用。
【问题讨论】:
标签: gradle
Gradle 的 exec 与 Groovy 的 .execute() 有很大不同。 Gradle 的exec 会将输出通过管道传输到标准输出并等待命令完成,然后再进行下一个任务。 Groovy 的.execute() 只返回一个Process。该过程将在后台并行运行。除非您查找它等,否则您将看不到输出。
要使 Groovy 的 [].execute() 像 Gradle 的 exec 一样工作,您必须定义这样的方法:
void execute(String... args) {
println "Executing $args...";
def proc = args.execute();
proc.in.eachLine {line -> println line}
proc.err.eachLine {line -> println 'ERROR: ' + line}
proc.waitFor()
}
然后在你的任务中做这样的事情:
task someTask() {
doLast {
execute("cmd", "/c", "echo Hello World!");
}
}
即使在这种情况下,如果任务失败,您的构建也不会失败!
tl;dr 使用 Gradle 的 exec()
【讨论】:
project.exec 在Worker 中不可用,因此感谢您发布此信息。仅供参考,可以抛出GradleTaskException(或工作人员中的类似内容)以使构建失败。它只是用任务实例包装 throwable
“Gradle”方式是定义具有单一职责的任务,因此任务依赖和结果是清晰易懂和可维护的。如果您想要更大的灵活性,只需编写一个纯 Groovy 脚本。
【讨论】: