Актуальное определение задачи копирования Gradle

Я относительно новичок в обучении и пытаюсь настроить задачу резервного копирования. У меня есть несколько примеров, сначала я опишу цель:

У меня есть несколько файлов в каталоге (назовите его "каталог данных"). Когда содержимое любого файла в этом каталоге данных изменено, я хочу создать новый каталог в "резервном хранилище" и скопировать каждый файл в каталоге данных в только что созданный каталог. Имя созданного каталога будет содержать текущую дату и время. На данный момент каталог данных не содержит подкаталогов.

У меня это работало нормально, когда "каталог данных" содержал один файл, и все, что я хотел сделать, это переименовать этот файл, чтобы включить дату. Пример:

task copyDocs(type: Copy) {
    from 'src/main/doc/testfile.html'
    into 'build/target/doc'

    rename { String fileName ->
        def date = new Date();
        date.format("YYYY-MM-dd--HH-mm-ss") + " " + fileName
    }
}

Это сработало отлично. Я мог запускать задачу "copyDocs" столько раз, сколько хотел, но он мог бы создать новый файл, только если бы я на самом деле изменил содержимое testfile.html. Теперь я хотел расширить это так, чтобы вместо создания нового файла, который был переименован, он создавал новый каталог и копировал в него исходный файл.

task copyDocs(type: Copy) {

    def dateStr = (new Date()).format("YYYY-MM-dd--HH-mm-ss");
    from 'src/main/doc/testfile.html'
    into 'build/target/doc/' + dateStr

}

Это не сработало так здорово. Хотя созданный каталог имеет имя, которое я хотел, проблема в том, что каждый раз, когда я запускаю задачу, он создает новый каталог и копирует testfile.html в него, независимо от того, был ли этот файл изменен.

Я знаю, что это как-то связано с "входными данными задачи" и так далее, и я прочитал части документации, которые описывают фазу инициализации в сравнении с фазой конфигурации и так далее. То, что я не нашел, является чем-то достаточно конкретным, чтобы помочь мне понять, почему задача копирования считает, что ее необходимо повторно запустить во втором случае, а не в первом.

Проще говоря, в обоих случаях потенциальные выходные файлы изменяются каждый раз, когда задача запускается как функция даты / времени. Входные файлы не изменяются в случае выполнения любой задачи. Так почему же второе задание нужно повторять каждый раз, а не первое? Есть ли простой способ "отладки" gradle, чтобы он явно сказал мне, почему это так?

Мы высоко ценим ваше время и помощь, мне интересно узнать больше о gradle, так как это кажется эффективной и современной системой сборки!

1 ответ

Решение

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

into 'build/target/doc/' + dateStr

(это зависит от секунд, но если вы урежете часы, дни, месяцы, эффект будет таким же, но реже), файл копируется каждый раз при выполнении задачи, даже если он не изменился. Чтобы устранить проблему, вам нужно изменить место назначения во время выполнения, что можно сделать следующим образом:

task copyDocs(type: Copy) {

    def dest = 'build/target/doc/'
    from 'src/main/doc/testfile.html'
    into dest
    eachFile { fcp ->
        def dateStr = (new Date()).format("YYYY-MM-dd--HH-mm-ss");
        fcp.path = dest + dateStr
    }
}

Таким образом, задача будет выполнена тогда и только тогда, когда from вход отличается.

Другие вопросы по тегам