gradle - 如果输出文件比输入文件新,如何定义自定义gradle任务跳过依赖关系

标签 gradle

我有一个具有以下结构的gradle项目:

我有一系列任务(让我们将它们称为taskA,taskB,taskC),它们接收一个输入文件(让我们将其称为source.tar.gz)并生成一个输出文件(让我们将其称为dist.tar.gz)。假设taskA / taskB / taskC需要运行进程等。

我还有一个任务(称为taskZ),可确保在taskA,taskB,taskC之后进行清理。假设它将停止由第一组任务启动的进程。

我有一个名为“make”的自定义任务,该任务取决于构建及其完成。像这样:

task make {
    dependsOn taskA, taskB, taskC
    finalizedBy taskZ
}

最后,gradle的内置“汇编”任务取决于我自定义的“制造”任务。

我想让gradle知道make的输入是“source.tar.gz”文件,输出是“dist.tar.gz”,因此如果“dist.tar.gz”比更新的版本,则不需要运行“make” 'source.tar.gz'。

我尝试声明“make”输入和输出,如下所示:
task make {
    dependsOn taskA, taskB, taskC
   finalizedBy taskZ

   inputs.file("$projectDir/src/main/source.tar.gz")
   outputs.file("$buildDir/dist.tar.gz")
}

但是gradle仍然每次都在运行整个过程。

我有什么办法可以告诉gradle跳过“make”任务及其依赖项?

最佳答案

Gradle的增量构建不仅仅基于时间戳(这些天甚至可能不考虑时间戳),因此它对您尝试执行的操作没有帮助。最重要的是,我敢肯定,即使以这种方式配置了make,任务A-> C也将始终运行。 make必须首先确保其依赖项已运行或已为最新。

鉴于此,我认为您可能需要在onlyIf()检查中使用专用的时间戳检查。就像是:

make.onlyIf { inputFile.lastModified() > outputFile.lastModified() }

其中inputFileoutputFile是相关文件的路径(例如,使用project.file())。我认为这不是绝对可靠,但对于您的用例来说可能就足够了。

或者,如果可以使用适当的已定义输入和输出配置这样的任务,则创建一个一起执行B和C的自定义任务。我认为这是基于给定信息的更好的解决方案。

关于gradle - 如果输出文件比输入文件新,如何定义自定义gradle任务跳过依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51139819/

相关文章:

gradle - 强制从存储库下载依赖项,但仅针对特定程序包

java - 如何修复 android studio 的所有/大多数依赖错误

android - Gradle 和嵌套的非传递依赖

android - 在Android应用程序开发中遇到错误

eclipse - 在 Eclipse EJB Gradle 项目中将 persistence.xml 放在哪里?

gradle - 它当前正被另一个 Gradle 实例使用

android - 使用 rxjava-android 的问题

kotlin - 了解在 Gradle 中应用插件的所有方法

android - 如何删除 Gradle 冲突

Gradle聚合任务