【问题标题】:How should I structure these gradle task dependencies?我应该如何构建这些 gradle 任务依赖项?
【发布时间】:2018-02-27 00:58:52
【问题描述】:

我有这些 gradle 任务:
- startTestDatabaseContainer: 构建并启动一个带有数据库的 docker 容器
- removeTestDatabaseContainer:停止并移除 docker 容器
- flywayValidate:来自org.flywaydb.flyway 的任务,用于验证我的迁移文件

我希望按顺序运行这三个任务。阅读this 将我引向这个解决方案:

flywayValidate.dependsOn startTestDatabaseContainer
flywayValidate.finalizedBy removeTestDatabaseContainer

这工作正常,但是如果没有startTestDatabaseContainer 和removeTestDatabaseContainer 也被调用,我就无法从命令行运行gradle flywayValidate。我希望能够运行 flywayValidate 而不会发生这种情况。

当我无法在 gradle 中排序依赖项时,我该怎么做?

我的第一次尝试很简单:

task validateMigration {
    dependsOn startTestDatabaseContainer
    dependsOn flywayValidate
    finalizedBy removeTestDatabaseContainer
}

但这失败了,因为flywayValidate 可以在startTestDatabaseContainer 之前运行。

编辑:我在Opal 的解决方案上设置了一个演示基础:github.com/stianlagstad/flyway-migration-error-causes-final-gradle-task-to-not-execute。克隆它并运行gradle validateMigration。迁移将失败,最终的 gradle 任务将不会运行(docker ps 将显示容器仍在运行)。如果您修复了迁移文件,那么一切都会按预期进行。我确定我误解了一些东西。任何指针都会有所帮助!

【问题讨论】:

    标签: gradle flyway


    【解决方案1】:

    以下设置应满足您的所有要求:

    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
    }
    

    Here 是一个演示。

    【讨论】:

    • 谢谢!我遇到了另一个问题:当迁移失败时,removeTestDatabaseContainer 任务没有运行(我通过添加一个带有 println 的 doLast 来确认这一点,看到 docker 容器仍在运行)。如果我删除了validateMigration 任务中关于flywayValidate 的两行,那么removeTestDatabaseContainer 运行成功。你有什么建议吗?
    • 再次感谢您。但是,似乎没有调用 removeTestDatabaseContainer。我将编辑我的原始问题,向您展示您编辑中代码的输出是什么样的。
    • 抱歉,好像我运行了错误的命令。将进一步测试。
    • 您的示例运行良好:) 它只是在我的项目中不起作用。我将创建一个可重现的示例。
    • 啊..当然。 --continue 是一个选项,但没有它也可以工作。
    【解决方案2】:
    task validateMigration {
        dependsOn startTestDatabaseContainer
        dependsOn flywayMigrate
        flywayMigrate.finalizedBy removeTestDatabaseContainer
        flywayMigrate.mustRunAfter startTestDatabaseContainer
    }
    

    这成功了!谢谢orzeh for the PR on Github,也谢谢Opal的帮助!

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 2023-03-17
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多