копирование работает в gradle, но zip выдает странную ошибку

Я пытаюсь использовать zip в gradle, и моя сборка работала нормально, пока я не добавил это в свой раздел для проекта «веб-сервер» (может быть, мой вопрос должен заключаться в том, почему копия работает без задачи перед ней?????. ..Меня просто очень смущает разница между копией и zip, если вам нужна задача перед zip, а не копировать ниже)

assemble << {
    zip {
       from '.'
       includes ['app/*','conf/*','public/*','play-1.2.4/*','run*.sh']
    }
}

Ошибка

  • What went wrong: Execution failed for task ':webserver:assemble'.

    Не удалось найти метод zip() для аргументов [build_3nljqgmljp29v06751h102sq8b$_run_closure3_closure16_closure18@7cc8e407] в задаче ':webserver:assemble'.

Я не понимаю, так как успешно использую копирование

copy { from fixedLibDir into genLibDir }

Кроме того, меня очень сильно смущает документация, так как в документации почти всегда есть

task myZip(type: Zip) {

}

Я просто хочу вызывать zip-задачу, а не создавать новую каждый раз, поэтому примеры документации кажутся очень плохими... они должны быть примерами использования zip-задачи, а не создания новой (в конце концов, кто хочет создать новая zip-задача, когда она уже существует??) ИЛИ я что-то здесь упускаю? Во всяком случае, это смутило меня, когда я начал работать с gradle, и я предполагаю, что это смутит других. Было бы неплохо показать как его использование, так и определение нового (хотя я до сих пор не понимаю, зачем определять новый).

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ/ОБНОВЛЕНИЕ: я также попробовал этот код, который запускается, и я вижу сообщение о распечатке, но я не вижу zip-файла в моем каталоге webserver/output/libs, как я и ожидал???

assemble << {
    println "I'm zipping up now"
    task zip(type: Zip) {
        from('.') {
            fileMode = 0755
            include 'run*.sh'
            include 'app/*'
        }
    }

}

позже, Дин


person Dean Hiller    schedule 26.06.2012    source источник
comment
Последний фрагмент — это объявление задачи внутри действия задачи; это никогда не сработает.   -  person Peter Niederwieser    schedule 26.06.2012


Ответы (3)


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

С другой стороны, эквивалентного метода zip не существует. Возможно, из-за того, что архивирование обычно требует большей настройки, чем копирование, например, указание имени zip-архива, или, может быть, они просто пропустили это. Это означает, что вы должны использовать синтаксис task zip(type: Zip){ from ... into ... } для zip.

person rodion    schedule 26.06.2012

В отличие от Copy, copy не является задачей; это просто метод класса Project. Gradle не имеет никакой информации и не контролирует выполнение методов, как для задач. Следовательно, методы имеют некоторые недостатки по сравнению с соответствующими задачами (например, отсутствие проверки актуальности) и должны использоваться только тогда, когда задача не является вариантом (что случается реже, чем вы думаете).

Что касается zip, то такого метода просто нет, в частности не на Project классе. Лучшее место для поиска такой информации — справочник по Gradle DSL.

в конце концов, кто хочет создавать новую задачу zip, когда она уже существует

Не уверен, что вы имеете в виду под этим; возможно, вы путаете задачи и типы задач. Совершенно нормально использовать отдельную задачу для каждого создаваемого zip-файла.

PS: я рекомендую сделать шаг назад и узнать больше о Gradle, прежде чем приступать к реальным сборкам.

person Peter Niederwieser    schedule 26.06.2012
comment
когда я погружаюсь, я погружаюсь довольно глубоко (я дважды читал документы и сейчас только укрепляюсь/понимаю). Это проясняет большую часть моего замешательства. Благодарность, - person Dean Hiller; 26.06.2012

Я думаю, что правильный способ сделать это сейчас

task myZip(type: Zip) {
    from('.') {
        include 'run*.sh'
        include 'app/*'
    }
}

assemble.dependsOn('myZip')
    //This last line is important of course!!!!

Я не уверен, что следующее делает, если честно, поскольку оно ничего не делает, кроме println

assemble << {
    println "I'm zipping up now"
    task zip(type: Zip) {
        from('.') {
            fileMode = 0755
            include 'run*.sh'
            include 'app/*'
        }
    }

}
person Dean Hiller    schedule 26.06.2012
comment
Очень важно понимать, что сборка Gradle проходит в три этапа: инициализация, настройка и выполнение. Последний фрагмент кода пытается добавить задачу на этапе выполнения сборки. Это слишком поздно — добавление задачи — это форма настройки, и поэтому ее необходимо выполнять на этапе настройки. В конце этапа настройки Gradle создает план выполнения, определяющий, какие задачи выполнять и в каком порядке. - person Peter Niederwieser; 26.06.2012
comment
спасибо за всю вашу помощь, я думаю, что разобрался со всеми углами (и да, я читал о 3 фазах). Я думаю, что это начинает погружаться (мне бы хотелось, чтобы там был метод, но у него есть недостатки) ... теперь нужно идти проповедовать град другим;). Мне это нравится, просто потребовалось время, чтобы понять многое из этого. - person Dean Hiller; 26.06.2012