【问题标题】:How to run Flyway migrations from a Gradle dependency?如何从 Gradle 依赖项运行 Flyway 迁移?
【发布时间】:2020-01-20 05:32:08
【问题描述】:

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

作为一种解决方案,我正在创建第三个项目,其唯一职责是运行迁移,两个原始应用程序都会从​​这个新应用程序中提取迁移,但我不知道如何实现这一点。

我见过的最接近我需要的是来自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'
}

【问题讨论】:

    标签: spring-boot gradle flyway


    【解决方案1】:

    如果你使用的是 Gradle 多项目布局,并且喜欢使用 Flyway 插件,我想你可以直接配置迁移文件夹。像这样的:

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

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

    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 建立一个任务依赖关系来实现类似的事情。

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 1970-01-01
      • 2019-04-16
      • 2017-09-17
      • 2016-12-12
      • 1970-01-01
      • 2012-07-23
      • 2015-09-21
      • 2020-06-28
      相关资源
      最近更新 更多