Определить порядок задач без зависимости в 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"