【问题标题】:Gradle to run a command line process: execute() vs commandLineGradle 运行命令行进程:execute() vs commandLine
【发布时间】:2020-08-18 00:18:33
【问题描述】:

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

【问题讨论】:

    标签: gradle


    【解决方案1】:

    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.execWorker 中不可用,因此感谢您发布此信息。仅供参考,可以抛出GradleTaskException(或工作人员中的类似内容)以使构建失败。它只是用任务实例包装 throwable
    【解决方案2】:

    “Gradle”方式是定义具有单一职责的任务,因此任务依赖和结果是清晰易懂和可维护的。如果您想要更大的灵活性,只需编写一个纯 Groovy 脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多