Flyway Gradle插件 - 循环依赖

时间:2014-03-02 15:43:10

标签: gradle circular-dependency flyway mybatis-generator

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

  compileJava.dependsOn('myBatisGenerator')

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

        myBatisGenerator.dependsOn('flywayMigrate')

当我尝试使用gradle测试运行构建时,我收到以下错误:

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插件?

2 个答案:

答案 0 :(得分: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项目)

答案 1 :(得分:2)

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

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