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.

560   1  

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

    Ничего не найдено.