Не уверен, правильно ли я понял вопрос или почему вы упоминаете кеш сборки. Я предполагаю, что вы не знаете, что предикаты, добавленные с upToDateWhen()
, считаются в дополнение к любым другим актуальным проверкам, подобным тем, которые добавлены с TaskOutputs.dir()
?
Возьмите следующий пример задачи:
task foo {
def outDir = file('out')
outputs.dir(outDir)
outputs.upToDateWhen { outDir.listFiles().length == 1 }
doLast {
new File(outDir, 'foo.txt') << 'whatever'
}
}
Пока в выходном каталоге есть только один файл (настроенный с помощью upToDateWhen
) и , файл, созданный задачей (out/foo.txt
), не изменяется после выполнения задачи запустить, задача будет актуальной. Если вы измените / удалите файл, созданный задачей, в выходной каталог или добавите дополнительные файлы в выходной каталог, то задача будет запущена снова.
Обновленный ответ согласно обновленному вопросу из комментариев:
task foo {
def outDir = file('out')
/* sample task action: */
doFirst {
def numOutFiles = new Random().nextInt(5)
for (int i = 1; i <= numOutFiles; i++) {
new File(outDir, "foo${i}.txt") << 'whatever'
}
}
/* up-to-date checking configuration: */
def counterFile = new File(buildDir, 'counterFile.txt')
outputs.dir(outDir)
outputs.upToDateWhen {
counterFile.isFile() \
&& counterFile.text as Integer == countFiles(outDir)
}
doLast {
counterFile.text = countFiles(outDir)
}
}
def countFiles(def dir) {
def result = 0
def files = dir.listFiles()
if (files != null) {
files.each {
result++
if (it.isDirectory()) {
result += countFiles(it)
}
}
}
result
}