Gradle's mustRunAfter / finalizedBy только для конкретной задачи?
Я пытаюсь заставить Грэдла mustRunAfter и finalizedBy работать только для конкретной задачи. Возьмем такой пример build.gradle:
task removeTestDatabaseContainer {
doLast {
println 'ninside removeTestDatabaseContainern'
}
}
task startTestDatabaseContainer {
doLast {
println 'ninside startTestDatabaseContainern'
}
finalizedBy removeTestDatabaseContainer
}
task flywayMigrate { t->
doLast {
println 'n inside flywayMigraten'
}
}
task flywayClean { t->
doLast {
println 'n inside flywayCleann'
}
}
task testEverything {
dependsOn startTestDatabaseContainer
dependsOn flywayMigrate
dependsOn flywayClean
flywayMigrate.mustRunAfter startTestDatabaseContainer
flywayMigrate.finalizedBy flywayClean
flywayClean.mustRunAfter flywayMigrate
flywayClean.finalizedBy removeTestDatabaseContainer
}
Я доволен тем, как testEverything работает. Мне нужен результат, который я получаю от этой задачи:
➜ gradle testEverything
Parallel execution is an incubating feature.
:startTestDatabaseContainer
inside startTestDatabaseContainer
:flywayMigrate
inside flywayMigrate
:flywayClean
inside flywayClean
:removeTestDatabaseContainer
inside removeTestDatabaseContainer
:testEverything
BUILD SUCCESSFUL
Total time: 0.597 secs
Однако, когда я бегу только flywayMigrate, я получаю неожиданные проблемы. Это выход:
➜ gradle flywayMigrate
Parallel execution is an incubating feature.
:flywayMigrate
inside flywayMigrate
:flywayClean
inside flywayClean
:removeTestDatabaseContainer
inside removeTestDatabaseContainer
BUILD SUCCESSFUL
Total time: 0.605 secs
Это не тот результат, который мне нужен. Я хотел бы только flywayMigrate бежать. Вопрос 1) Как я могу заставить testEverything работать так, как он работает, и в то же время иметь gradle flywayMigrate только вызывать Задача flywayMigrate?
Вопрос 2)
Мне сказали, что это как-то связано с тем, что все, что находится в скобках task testEverything {}, является конфигурацией, которая всегда обрабатывается Gradle. Так что никаких mustRunAfter/finalizedBy поставленная в рамках задачи задача будет иметь "глобальный эффект". Но в таком случае, почему gradle flywayMigrate не вызывает startTestDatabaseContainer? (Из-за строки flywayMigrate.mustRunAfter startTestDatabaseContainer внутри задачи testEverything.)
Edit: я был направлен на упорядочивание задач и задачи финализатора в Gradle документация и они отвечают на вопрос 2: mustRunAfter вступает в силу только тогда, когда выполняются обе задачи. finalizedBy с другой стороны, вступает в силу, когда выполняется только задача, на которую он поставлен. Это отвечает, Почему flywayClean и removeTestDatabasContainer запускаются, когда я выполняю gradle flywayMigrate.
Я все еще пытаюсь заставить gradle testEverything работать так, как это делается выше, и в то же время заставить gradle flywayMigrate просто выполнить flywayMigrate.
1 ответ:
Благодаря помощи ЭСКАТО на #gradle на Freenode я нашел решение. Это было просто, чтобы удалить завершенные строки, которые у меня были. Обновленная сборка.gradle, который работает:
task removeTestDatabaseContainer { doLast { println '\ninside removeTestDatabaseContainer\n' } } task startTestDatabaseContainer { doLast { println '\ninside startTestDatabaseContainer\n' } finalizedBy removeTestDatabaseContainer } task flywayMigrate { t-> doLast { println '\n inside flywayMigrate\n' } } task flywayClean { t-> doLast { println '\n inside flywayClean\n' } } task testEverything { dependsOn startTestDatabaseContainer dependsOn flywayMigrate dependsOn flywayClean flywayMigrate.mustRunAfter startTestDatabaseContainer //flywayMigrate.finalizedBy flywayClean flywayClean.mustRunAfter flywayMigrate //flywayClean.finalizedBy removeTestDatabaseContainer }
Comments