Gradle: Добавочная поддержка сборки для выходного каталога с учетом добавленных файлов - PullRequest
0 голосов
/ 07 января 2019

Документация Gradle говорит об этом:

Обратите внимание, что если в задаче указан выходной каталог, любые файлы, добавленные в этот каталог с момента последнего запуска, игнорируются и НЕ приведут к устареванию задачи. Это связано с тем, что несвязанные задачи могут совместно использовать выходной каталог, не мешая друг другу. Если это не то поведение, которое вам нужно по какой-либо причине, рассмотрите возможность использования TaskOutputs.upToDateWhen (groovy.lang.Closure)

Вопрос: Как выглядит решение с upToDate, когда (так что рассматриваются добавленные файлы). Основная проблема заключается в том, что необходимо получить доступ к кэшу сборки для получения хэша содержимого выходного каталога во время последнего запуска задачи.

1 Ответ

0 голосов
/ 08 января 2019

Не уверен, правильно ли я понял вопрос или почему вы упоминаете кеш сборки. Я предполагаю, что вы не знаете, что предикаты, добавленные с 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...