gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:09:06 25 4
gpt4 key购买 nike

我有一个具有以下结构的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com