如何从Gradle依赖项运行Flyway迁移?

时间:2019-09-19 08:18:16

标签: spring-boot gradle flyway

我有两个Spring Boot Web服务,它们必须都使用相同的数据库,相同的架构和相同的表-一个服务从表中读取数据,另一个服务向它们中写入数据。现在,其中一项服务正在开发中,并且可以与内存数据库(而不是真正的DB)一起使用,因此我可以使每个服务都包含其自己的数据库迁移副本。两种服务都在同一个数据库上运行后,将无法正常工作-第一个启动的数据库将运行其迁移,而另一个将失败。但是,这两个项目仍然必须进行迁移,因为需要它们来创建用于自动测试的内存数据库。

作为一个解决方案,我正在做第三个项目,它的唯一职责是运行迁移,两个原始应用程序都将从这个新的应用程序中进行迁移,但是我仍然坚持如何做到这一点。 / p>

与我所需要的最接近的东西是来自another SO question的这段代码:

sourceSets {
    main {
        resources {
            srcDirs += [
                project(':data').sourceSets.main.resources
            ]
        }
    }
}

但这是为了包括来自另一个本地项目的资源,而不是gradle依赖项的资源。我已经列出了我的私有Maven存储库,并且依赖性已解决,但是我很困惑要写什么,而不是上面那个块的内线。

repositories {
    mavenCentral()
    maven {
        url "http://my.repo.link/"
    }
}

dependencies {
    // other dependencies 
    runtime 'my.group:database-project:1.0'
}

1 个答案:

答案 0 :(得分:0)

如果您正在使用Gradle多项目布局,并且希望使用Flyway插件,我想您可以直接配置迁移文件夹。像这样:

flyway {
  locations = ["filesystem:$rootDir/data/migrations"]
}

如果您使用的是独立项目,则可以使用java插件将迁移打包到jar文件中,然后将其发布到Maven存储库并对其进行正常依赖。如果您不想将迁移放在应用程序类路径上,则可以将依赖项放在自定义配置中。而且,如果您使用非标准的文件夹结构,则可以通过classpath:参数中的locations值进行配置。像这样:

configurations {
    flywayMigration
}

dependencies {
    flywayMigration "com.group:database-project:1.0" // Jar file containing your migration scripts
}

flyway {
    configurations = ["flywayMigration"]
    locations = ["classpath:db/migrations"]
}

除非我误解了您的要求,否则您不需要第三方项目来应用迁移。 (尽管您仍然可以根据需要提供。)在我的项目中,我们处于类似的情况,并且我们所有的Spring Boot应用程序都将迁移脚本与它们捆绑在一起,然后在启动时我们有问题地应用迁移到数据库。在这种情况下,在干净的数据库上,第一个应用程序将执行所有迁移,而所有后续迁移将仅验证一切正常。 Flyway还支持并行迁移,因此不应有任何并发​​问题。您可以通过将Flyway插件应用于所有Boot项目,然后从bootRun到flywayMigrate建立任务依赖性,来实现类似的目的。