Gradle-在一项任务中执行多个命令而不会破坏增量构建

时间:2018-08-02 16:12:00

标签: gradle incremental-build

因此,我们使用gradle增量构建,并且希望运行两个命令(理想情况下是从一个任务执行)。一种解决方案here可以使两个命令运行……但是它破坏了增量构建。看起来像这样:

task myTask() {
inputs.files(inputFiles)

  project.exec {
     workingDir web
     commandLine('mycmd')
  }
  project.exec {
    workingDir web
    commandLine('mysecond-cmd')
  }
}

如果运行单个命令并执行增量构建,则该任务看起来与此类似,似乎有所不同的是workingDir

task myTask(type: Exec)  {
     workingDir  myDir // this seems to trigger/enable continuos compilation
    commandLine ('myCmd')
 }

到目前为止,最好的选择是创建3个任务,每个我要运行的cmdline任务一个,另一个将它们分组,这似乎很脏。

所以问题是:有一种方法可以在一个任务中运行两个或多个命令,而增量构建仍在工作?

1 个答案:

答案 0 :(得分:1)

我将尝试从评论中回答问题:我如何从没有输出文件的任务中发出信号,指示构建应监视某些文件。不幸的是,如果不知道确切的用例,很难回答。

首先,Gradle需要某种形式的声明输出,它可以检查以查看任务是否已运行或是否需要运行。考虑到该任务在上一次运行期间可能已失败,但是此后输入文件没有更改。 Gradle应该运行任务吗?

如果您的任务没有任何输出,则意味着您需要考虑为什么该任务应该在任何给定的构建执行中运行或不运行。如果不创建或修改文件或与系统的其他部分进行交互,该怎么办?

假设增量构建是正确的解决方案-可能并非如此-Gradle确实允许您通过TaskOutputs.upToDateWhen(Action)处理异常情况。这是一个具有简单任务(gen)的示例,该任务生成一个文件,该文件充当任务(runIt)的输入,但没有输出:

task gen {
    ext.outputDir = "$buildDir/stuff"
    outputs.dir outputDir

    doLast {
        new File(outputDir, "test.txt").text = "Hurray!\n"
    }
}

task runIt {
    inputs.dir gen
    outputs.upToDateWhen { !gen.didWork }
    doLast {
        println "Running it"
    }
}

这指定runIt仅在输入文件已更改或任务gen实际上做了某件事时才运行。在此示例中,这两种情况等同于同一件事。如果gen运行,则runIt的输入文件已更改。

要理解的关键是,您为upToDateWhen()提供的条件是在构建的执行阶段而不是配置阶段进行评估的。

希望有帮助,如果您需要任何说明,请告诉我。