我有一个使用 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]
}