在flyway

时间:2017-03-15 08:36:34

标签: gradle spring-boot groovy flyway

我使用Spring-Boot / Gradle在Groovy中编写了许多项目。所有这些应用程序都为不同的客户端执行类似的工作,但共享大量功能。

为了避免代码重复,我已将共享组件分离到库中,当然这适用于Groovy代码。但是,该库还包含用于创建库所依赖的模式的Flyway脚本。

由于数据隔离规则并且为了使应用程序完全分离,每个应用程序需要在其自己的架构中拥有自己的数据库表副本,并且每个应用程序在其自己的application.yaml中都有自己的数据库连接详细信息。

我能够解决的是如何在单独的项目构建中使用共享的Flyway脚本。

我可以看到实现这一目标的一种方法是每次针对相应的数据库运行库的Flyway迁移多次(每个应用一次),但这将涉及将所有应用的数据库详细信息放入库 - 再次重复。

我可以看到实现这一目标的另一种方法是将Flyway脚本放在应用程序项目中,但这将涉及从库中复制脚本,而不是只有一个副本我会有n个副本。这将使更改变得痛苦(如果我想将更改应用于所有或许多项目),并且还将应用程序绑定到应该由库隐藏的数据库模式定义。

还有其他人处理过这个问题吗?我错过了什么明显的东西?或者我只是问Flyway它不能做什么?

谢谢

1 个答案:

答案 0 :(得分:1)

您的公共类文件和flyway脚本是否在同一个.jar文件中?如果这是真的,那么你不希望在buildscript类路径上使用jar,所以我建议将脚本解压缩到一个文件夹并从文件系统中查找。

例如:

buildscript {
    classpath 'my.db:driver:1.0'
}
apply plugin: 'groovy'
configurations {
    flywayScripts { traisitive = false }
}
dependencies {
    compile 'com.foo:common:1.0' // assuming you also want to compile against common classes
    flywayScripts 'com.foo:common:1.0'
}
task extractFlywayScripts(type: Copy) {
    from zipTree(configurations.flywayScripts.singleFile).matching {
        include 'path/to/migration/scripts/*.xml'
    }
    into "$buildDir/flywayScripts"
}

// wire the extraction task into the DAG
flywayMigrate.dependsOn extractFlywayScripts

flyway {
    def yamlConfig = parseYaml('path/to/application.yaml') // TODO: implement parseYaml(...)
    locations = ["filesystem:$buildDir/flywayScripts", "filesystem:src/main/resources/db/migration"]
    url = yamlConfig.url
    user = yamlConfig.user
    password = yamlConfig.password

    // etc        
}