Подтвердить что ты не робот

Как расширить gradle чистую задачу, чтобы удалить файл?

До сих пор я добавил следующее в мой build.gradle

apply plugin: 'base' 
clean << {
    delete '${rootDir}/api-library/auto-generated-classes/'
    println '${rootDir}/api-library/auto-generated-classes/'
}

Однако не только мой файл не удаляется, но оператор печати показывает, что ${rootDir} не преобразовывается в корневую директорию моего проекта. Почему это не будет работать, какие понятия мне не хватает?

4b9b3361

Ответ 1

Вам просто нужно использовать двойные кавычки. Кроме того, отмените << и используйте doFirst вместо этого, если вы планируете делать удаление во время выполнения. Что-то вроде этого:

clean.doFirst {
    delete "${rootDir}/api-library/auto-generated-classes/"
    println "${rootDir}/api-library/auto-generated-classes/"
}

Gradle скрипты сборки записываются в Groovy DSL. В Groovy вам нужно использовать двойные кавычки для интерполяции строк (когда вы используете ${} в качестве заполнителей). Посмотрите здесь.

Ответ 2

<< эквивалентен для clean.doLast. doFirst и doLast упорядочивают операции на этапе выполнения, что редко относится к операциям удаления.

В этом случае вам не нужны никакие из них. Чистая задача из базы имеет тип Delete, поэтому вам просто нужно передать ему закрытие, чтобы сообщить ему во время настройки, что нужно удалить при выполнении:

clean {
    delete 'someFile'
}

AS mushfek0001 правильно указывает на это в своем ответе, вы должны использовать двойные кавычки для переменной интерполяции:

clean {
    delete "${buildDir}/someFile"
}

У вас должен быть хотя бы базовый плагин, применяемый для этого, чтобы работать, большинство других плагинов, например плагин Java, либо применяют базу, либо объявляют свои собственные clean задача типа delete Delete. Ошибка, которую вы получили бы, если у вас ее нет, это отсутствующий метод clean.

apply plugin: 'base'

Ответ 3

Чтобы расширить чистую задачу, вы можете использовать

clean.doFirst {}

или

clean.doLast {}

Это позволит вам вводить свои собственные действия в чистый процесс. Для удаления файлов и каталогов вы можете использовать API-интерфейс "file", который не требует дополнительных плагинов.

Вот пример, который удалит как файл, так и каталог как последний шаг в чистой задаче:

clean.doLast {
    file('src/main/someFile.txt').delete()
    file('src/main/libs').deleteDir()
}