我应该如何构建这些Gradle任务依赖性



我有这些gradle任务:
-startTestDatabaseContainer:构建并启动使用数据库的Docker容器
-removeTestDatabaseContainer:停止并卸下Docker容器
-flywayValidateorg.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的帮助!

最新更新