2014-09-15 1 views
-1

Я пытаюсь включить ZIP-файл в файл TAR в сборке градации. Я не сумасшедший, это репликация существующего скрипта муравья, и я не могу изменить раскладку по различным бизнес-причинам.Как запустить задачу за другим с помощью taskGraph.when Закройте закрытие

  • У меня использовать whenReady замыкание на collect dependencies без проблем
  • whenReady означает, что файл ZIP не строится не только после того, задача buildTar завершена, даже если buildTar зависит от buildZip.
  • Я не могу назвать tar {} напрямую, так как gradle не поддерживает это
  • Gradle, похоже, напрямую не поддерживает вызовы.

Это общее расположение У меня есть

task buildZip(type: Zip) { 
    gradle.taskGraph.whenReady { 
     // build zip file usual way with from blocks 
     from(...) { 
     } 
     from(...) { 
     } 
    } 
    doLast { 
     println "ZIP ready" 
     // could I call tar task from here?? 
    } 
} 

task buildTar(type: Tar, dependsOn: buildZip) { 
    println "Building TAR" 
    from (buildZip.archivePath) { 
    } 
    ... more stuff, installer script etc. 
} 

Выход я вижу с Gradle: buildTar, т.е. TAR строит перед ZIP построен.

Building TAR 
ZIP ready 

Обновление.

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

ТДО не строится перед Zip, задача Тар быть настроена перед задачей Zip выполняется

Update.

Этот вопрос больше не нужно, как вариант duplicatesStrategy можно использовать в ZIP задаче, чтобы избежать проблем быть «фиксированный» с gradle.taskGraph.whenReady

+1

Тар не строится перед Zip, задача Tar выполняется * сконфигурирована * перед выполнением задачи Zip. См. Http: // www.gradle.org/docs/current/userguide/userguide_single.html#build_lifecycle –

+0

@PerrynFowler. Не могли бы вы добавить свой комментарий в качестве ответа, и я соглашусь с ним. – Adam

ответ

2

Ответ на этот вопрос был фактически предоставлен Перрином Фаулером в верхних комментариях, это было основано на моем непонимании исполнения и конфигурации в градиенте. Я создал этот ответ, поэтому вопрос отмечен как ответ. Другой ответ просто перефразирует исходный вопрос ссылкой на userguide.

Дегтярные не строятся перед Zip, задача Тар быть настроена перед задачей Страны выполнена

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

+0

'from' не выполняется позже, если не используется' from {...} ', который является более точным способом отложить оценку, чем 'gradle.taskGraph.whenReady {from ...}'. –

+0

Да, я полностью согласен в общем случае. Однако, если ваш «from» is from (subprojects.configurations.compile), я обнаружил, что все немного отличается ... subprojects.configurations.compile возвращает дубликаты в мультипроектной настройке, и единственный способ удалить эти дубликаты - вызвать подпроекты .configurations.compile.resolvedConfiguration, однако это должно быть ниже ПОСЛЕ gradle.taskGraph.whenReady, если это сделано ДО, т.е. без gradle.taskGraph.whenReady, тогда подпроекты не смогут настроить свои блоки зависимостей, поскольку они уже отмечены как разрешенные (изменения только для чтения). – Adam

1

Здесь у вас есть образец рабочий раствор:

build.gradle:

task buildZip(type: Zip) { 
    from 'dir' 
    destinationDir project.file('build/zip') 
    archiveName 'lol.zip' 
} 

task buildTar(type: Tar, dependsOn: buildZip) { 
    from 'build/zip' 
    include '*.zip' 
    destinationDir project.file('build/tar') 
    archiveName 'lol.tar' 
} 

Это ясно для вас?

P.S. Я думаю, что это хорошая идея для вас прочитать userguide.

+0

К сожалению, мне нужно использовать gradle.taskGraph.whenReady по причинам, описанным в ссылке в исходной задаче. Я прочитал userguide ... – Adam

+0

Хорошо. Могли бы вы, пожалуйста, подготовить SSCCE, чтобы лучше понять требования? – Opal

+1

Вместо 'gradle.taskGraph.whenReady {from ...}', 'from {...}' следует использовать. Во всяком случае, это ничего не меняет. 'buildTar' должен использовать' from buildZip', что также делает явным 'dependOn' ненужным. –