【问题标题】:Execute more than one command in a task without breaking incremental build在一项任务中执行多个命令而不中断增量构建
【发布时间】:2021-10-17 04:05:44
【问题描述】:

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

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

【问题讨论】:

  • 我查看了Exec 的代码,workingDir 不考虑进行最新检查。这些命令会生成文件吗?增量构建通常仅在您同时声明输入 和 输出时才有效。 myTask 只声明输入。
  • 感谢您的评论,这些命令仅运行构建步骤,没有有趣的输出文件。
  • Gradle 应该如何知道它是否需要再次运行该命令?我看不到任何自动创建和注册文件以证明命令已运行的内容。顺便说一句,您使用过“增量构建”、“增量编译”和“持续编译”,它们都是不同的东西。如果你能准确地澄清你想要发生的事情,也许会有所帮助。使用单个命令“增量编译”以什么方式工作?
  • 我合并为增量构建,我正在寻找在文件更改时触发构建的功能......关于它应该如何知道的 gradle,这是问题的一部分,它很高兴知道增量构建是如何工作的(例如,我如何从没有输出文件的任务中发出信号表明构建应该监视某些文件)

标签: gradle incremental-build


【解决方案1】:

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

首先,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() 的条件是在构建的执行 阶段而不是配置阶段评估的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多