我有这些gradle任务:
-startTestDatabaseContainer
:构建并启动使用数据库的Docker容器
-removeTestDatabaseContainer
:停止并卸下Docker容器
-flywayValidate
:org.flywaydb.flyway
的任务验证了我的迁移文件
我希望按顺序运行这三个任务。阅读此信息使我了解了这个解决方案:
flywayValidate.dependsOn startTestDatabaseContainer
flywayValidate.finalizedBy removeTestDatabaseContainer
这可以正常工作,但是如果没有startTestDatabaseContainer
,我也无法从命令行中运行gradle flywayValidate
,并且removeTestDatabaseContainer
也被调用。我希望能够在不发生这种情况的情况下运行flywayValidate
。
当我不能在gradle中订购依赖项时,我该怎么做?
我的第一次尝试简单:
task validateMigration {
dependsOn startTestDatabaseContainer
dependsOn flywayValidate
finalizedBy removeTestDatabaseContainer
}
,但这会失败,因为flywayValidate
可以在startTestDatabaseContainer
之前运行。
编辑:我在此处设置了OPAL解决方案的演示基础:github.com/stianlagstad/flyway-migration-error-causes-final-final-final-gradle-task-to to-not-cecute。克隆并运行gradle validateMigration
。迁移将失败,最终的Gradle任务将无法运行(docker ps
将显示仍在运行的容器)。如果修复迁移文件,则一切都按预期工作。我敢肯定我在误会一些东西。任何指针都会有所帮助!
以下设置应满足您的所有要求:
task startTestDatabaseContainer {
doLast {
println 'startTestDatabaseContainer'
}
}
task flywayValidate {
doLast {
println 'flywayValidate'
}
}
task removeTestDatabaseContainer {
doLast {
println 'removeTestDatabaseContainer'
}
}
task validateMigration {
dependsOn startTestDatabaseContainer
dependsOn flywayValidate
flywayValidate.mustRunAfter startTestDatabaseContainer
finalizedBy removeTestDatabaseContainer
}
编辑
task removeTestDatabaseContainer {
doLast {
println 'removeTestDatabaseContainer'
}
}
task startTestDatabaseContainer {
doLast {
println 'startTestDatabaseContainer'
}
finalizedBy removeTestDatabaseContainer
}
task flywayValidate { t->
doLast {
println 'flywayValidate'
throw new TaskExecutionException(t, new RuntimeException('whatever'))
}
}
task validateMigration {
dependsOn startTestDatabaseContainer
dependsOn flywayValidate
flywayValidate.mustRunAfter startTestDatabaseContainer
}
这是一个演示。
task validateMigration {
dependsOn startTestDatabaseContainer
dependsOn flywayMigrate
flywayMigrate.finalizedBy removeTestDatabaseContainer
flywayMigrate.mustRunAfter startTestDatabaseContainer
}
这是一个技巧!谢谢您在Github上的PR,并感谢Opal的帮助!