Задание Gradle exec всегда выполняется, даже с входами == выходами - PullRequest
0 голосов
/ 22 мая 2019

У меня есть простая задача gradle, которая создает каталог

task foo(type: Exec) {
    inputs.dir 'foo'
    outputs.dir 'foo'

    commandLine 'mkdir', 'foo'
}

Проблема в том, что каждый раз, когда я запускаю задачу foo, она всегда запускается.Я ожидал, что он запустится в первый раз, тогда, понимая, что каталог существует, больше не запустится.Что мне не хватает?

Кроме того, как это будет работать в первый раз, когда каталог foo не существует?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Описание метода TaskInputs.dir() гласит:

Все файлы, найденные в данном каталоге, рассматриваются как входные файлы для этой задачи.

Таким образом, я предполагаю, существует ли каталог или нет, просто не проверяется, а только изменяются ли файлы внутри каталога.

Однако есть простой обходной путь. Просто используйте закрытие onlyIf в задаче, чтобы указать, когда его пропускать:

task foo(type: Exec) {
    onlyIf { file('foo').exists() }

    commandLine 'mkdir', 'foo'
}

Я использовал задачу Exec в своем примере только для того, чтобы держать ее как можно ближе к вашему вопросу, но учтите, что Gradle действительно предоставляет метод mkdir(), который должен быть предпочтительнее вызова инструмент командной строки. Имейте в виду, чтобы выполнить его внутри замыкания doFirst или doLast, поскольку он будет вызываться во время фазы конфигурации в противном случае.

Также обратите внимание, что Gradle создаст все необходимые каталоги (для Copy задач и т. Д.) Самостоятельно, поэтому в очень редких случаях требуется создавать каталоги вручную.

0 голосов
/ 23 мая 2019

Вот одно простое решение.
Используйте groovy скрипт в задании для создания папки.

task foo {
    def folder = new File("foo")

    // If it doesn’t exist, create a directory.
    if( !folder.exists() ) {
        folder.mkdirs()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...