Flyway Gradle 插件 - 循环依赖



我有一个使用 gradle、flyway gradle 插件、mybatis 生成器和 postgres 的项目。在我的build.gradle中,我有:

  compileJava.dependsOn('myBatisGenerator')

我想在 myBatisGenerator 运行之前运行 flywayMigrate 任务。所以我做了以下工作:

        myBatisGenerator.dependsOn('flywayMigrate')

当我尝试使用 gradle test 运行构建时,出现以下错误:

FAILURE: Build failed with an exception.
* What went wrong:
Circular dependency between the following tasks:
:classes
+--- :compileGroovy
|    --- :compileJava
|         --- :myBatisGenerator
|              --- :flywayMigrate
|                   --- :testClasses
|                        +--- :compileTestGroovy
|                        |    +--- :classes (*)
|                        |    --- :compileTestJava
|                        |         --- :classes (*)
|                        --- :compileTestJava (*)
--- :compileJava (*)
(*) - details omitted (listed previously)

我不确定为什么从flywayMigrate 插件中调用编译TestJava。任何想法如何解决此问题,并且仍然在mybatis生成器之前运行飞行路线插件?

我看了一下 flyway gradle 插件代码 (https://github.com/flyway/flyway/tree/master/flyway-gradle-plugin),我的猜测是 flyway 任务依赖于编译任务,以支持使用 flyway Java API 编写的迁移。

flyway 插件似乎假设如果项目是 Java 项目,那么您使用的是 Java API。

从字里行间可以看出,flyway 似乎希望您有一个单独的 gradle 子项目用于您的迁移。

因此,将迁移移动到称为"迁移"的子项目中。然后你可以做

myBatisGenerator.dependsOn(':migrations:flywayMigrate')

和 ':migrations:flywayMigrate' 将只依赖于 ':migrations:compileTestJava' 而不是你主要的 ':compileTestJava'(即使这样,也只有当 'migrations' 是一个 Java 项目时)

替代解决方法:https://github.com/flyway/flyway/issues/775

project.afterEvaluate {
    flywayClean.dependsOn -= testClasses
    flywayMigrate.dependsOn = [processResources, processTestResources]
}

最新更新