Gradle 运行命令行进程:execute() vs commandLine



在gradle中,有什么理由不使用Groovy的.execute()函数来运行命令行进程吗?我知道"gradle"方式是从 Exec 命令行。但感觉 .execute() 提供了更大的灵活性,例如能够在 doLast 块中使用。

Gradle的exec与Groovy的.execute()有很大不同。 Gradle 的exec会将输出通过管道传输到 stdout,并等待命令完成,然后再执行下一个任务。 Groovy的.execute()只返回一个进程。 该过程将在后台并行运行。除非您查找输出,否则您将看不到输出,等等。

为了使 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 Use Gradle's exec()

"Gradle"方法是定义具有单一职责的任务,因此任务依赖关系和结果是清晰可理解和可维护的。 如果你想要更大的灵活性,只需编写一个纯粹的Groovy脚本。

最新更新