Определить порядок задач без зависимости в Gradle?

вопрос

могу ли я каким-то образом убедиться, что задача будет выполнена до/после другой задачи, когда оба они должны быть выполнены? Я!--6-->не хочу добавить зависимость между ними, которая всегда рядом.

фон

у меня есть две задачи: одна, которая запускает сервер, и другая, которая выполняет тесты против него. Задача, которая запускает этот сервер, запускает его в новом процессе, поэтому я могу запустить gradle startServer runServerTests. Поскольку для запуска сервера требуется некоторое время, он должен можно запустить сервер с одним процессом gradle, а затем запустить тесты несколько раз с другим процессом gradle.

теперь я пытаюсь создать одну задачу, которая делает все, что делает наша среда CI, которая включает запуск сервера и запуск серверных тестов. Я, очевидно, хочу убедиться, что сервер запущен перед запуском тестов, но пока мне не повезло.

попытки

моя первая попытка ниже, но это не работает с порядок определенных зависимостей не гарантируется:

task doItAll(dependsOn: [startServer, runServerTests]) { ... }

моя вторая попытка, вызывая задачи в действиях не работает и не поддерживается:

task doItAll() << {
  tasks.startServer.execute()
  tasks.runServerTests.execute()
}

решения находятся на Дорожной карте (GRADLE-294, Инициализации/Финализации), но это не поможет мне сейчас.

5 ответов


Это, вероятно, не поможет вам в данный момент, но я недавно подал запрос на вытягивание в этой области, и было намекнуто, что он должен сделать это в 1.6 (в настоящее время они выпускают 1.5, и PR не сделал этого в этом выпуске) - см. обсуждение здесь . Ваш лучший выбор-дождаться pull-запрос быть объединены в master после 1.5 выпуска, а затем захватить первый доступный ночной сборки из здесь.

редактировать

Gradle в 1.6 была выпущена некоторое время назад, и теперь вы можете просто использовать mustRunAfter для достижения этой цели. См.раздел о заказе задач в Gradle manual для сведения.


http://issues.gradle.org/browse/GRADLE-294 был разрешен 1 мая (Gradle 1.6) и теперь дает вам способ описать, что задача B должна выполняться перед A, если оба присутствуют при использовании отношения mustRunAfter () между задачами.

поэтому я думаю, что на ваш вопрос полностью дан ответ.


улучшения задачи gradle finalizedBy и mustRunAfter идите каким-то образом к решению этих проблем. Однако, как и OP, мне нужно было изменить зависимости и завершение на основе задач, поставленных перед, а не статически определенными.

Я хочу gradle integrationTest для выполнения запуск, runTests и завершается остановка. Я также хотел запуск, runTests и остановка чтобы иметь возможность работать независимо-без каких-либо зависимостей или завершения.

вы можете статически создавать задачи-обертки, которые могли бы выразить это, однако это не масштабировалось хорошо, так как количество и сложность задач запуска и выключения увеличились - и полагались на тех, кто добавляет больше задач для добавления и поддержания необходимых оберток.

более элегантный я нашел, чтобы реализовать integrationTests как правило, задачи.

tasks.addRule('integrationTest: Full execution of integration tests with setup, startup,  shutdown and clean up') { String taskName ->
    if (taskName.equals('integrationTest')) {
        task(dependsOn: [runTests], taskName)

        // Add ordering and finalization for integration test runs        
        runTests.dependsOn startup
        startup.finalizedBy shutdown

        ... // and many other setup and shutdown tasks you want in the task DAG when running an integration test
    }
}

вы можете решить проблему заказа, явно объявив одну зависимость задачи:

runServerTests.dependsOn startServer

task doItAll(dependsOn: runServerTests) << {
   // do something
}

здесь работа в трубопроводе это касается вашего конкретного случая использования для вызова другого компонента, например контейнера сервлета для целей тестирования.


У меня была такая же проблема некоторое время назад - вот что я сделал для ее решения (вся история):

https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

TLDR; версия:

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets

def buildAliases = [
   'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'],
   'rebuild' : ['clean', 'assemble']
]
def expandedTaskList = []

gradle.startParameter.taskNames.each {
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
}

gradle.startParameter.taskNames = expandedTaskList.flatten()

println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n"