3

我有一个使用 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 插件中调用 compileTestJava。任何想法如何解决这个问题并且仍然在 mybatis 生成器之前运行 flyway 插件?

4

2 回答 2

3

我看了一下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 项目时)

于 2014-03-03T10:27:04.800 回答
2

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

project.afterEvaluate {
    flywayClean.dependsOn -= testClasses
    flywayMigrate.dependsOn = [processResources, processTestResources]
}
于 2014-12-24T16:32:51.853 回答