Ошибка Gradle zip, потому что zip не существует - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть скрипт сборки gradle, который содержит задачу, подобную следующей:

task unzip_foo_bar (type: Copy) {
    from zipTree ("foo.zip").matching { include '**/bar.h' }.singleFile
    into "build"
}

.zip-файл извлекается из внешнего репозитория в локальное рабочее пространство перед выполнением задачи.

Но по какой-то причине, когда вы используете .matching вместе с .singleFile, Gradle ожидает, что zip-файл уже присутствует в локальной рабочей области при компиляции скрипта.

В этом случаеСбой компиляции скрипта из-за того, что .zip-файл не существует во время компиляции.

Таким образом, без проблем работает следующее:

task unzip_foo_bar (type: Copy) {
    from zipTree ("foo.zip")
    into "build"
}

В этом случае Gradle может компилироватьсценарий, и он просто работает.

Может кто-нибудь объяснить разницу в поведении?

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

Как бы я сделал эту работу?

1 Ответ

1 голос
/ 20 сентября 2019

Метод zipTree в Gradle возвращает FileTree, который поддерживает отложенную оценку, так что содержимое дерева определяется только при необходимости.Различные типы задач, такие как задача Copy, поддерживают это поведение, позволяя пользователю передавать дерево в качестве входных данных.Дерево может быть построено на этапе конфигурации , но оно запрашивается только на этапе выполнения , если и когда задача выполнена.

Теперь проблема с вашим первым примеромв том, что вызов singleFile запускает оценку дерева, потому что ему нужно вернуть экземпляр File.Чтобы найти этот файл, Gradle должен открыть файл .zip и не может его найти, потому что файл не найден.Вызов matching не является проблемой, потому что он создает еще один FileTree с отложенным вычислением.Поэтому просто отбросьте вызов на singleFile и ваш код должен работать:

from zipTree ("foo.zip").matching { include '**/bar.h' }

Однако, если вы хотите сохранить утверждение, что только один файл соответствует шаблону, вы можете заключить свое выражение в Closure, что будет оцениваться лениво в целом:

from { zipTree ("foo.zip").matching { include '**/bar.h' }.singleFile }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...