0

我们使用 gradle 增量构建并希望运行两个命令(理想情况下来自一个任务)。这里的解决方案之一可以让两个命令运行......但是它破坏了增量构建......它看起来像:

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 任务,第三个用于对它们进行分组,这看起来很脏。

问题是:有没有办法在一个任务中运行两个或多个命令而增量构建仍然有效?

4

1 回答 1

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()评估的。

希望对您有所帮助,如果您需要任何澄清,请告诉我。

于 2018-08-07T16:35:18.247 回答