gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:56:32 25 4
gpt4 key购买 nike

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

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

我见过的最接近我需要的是来自 another SO question 的代码:

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

但这是为了包含来自另一个本地项目的资源,而不是来自 gradle 依赖项。我已经列出了我的私有(private) Maven 存储库并解决了依赖关系,但我对要写什么而不是上面那个 block 的内行感到困惑。
repositories {
mavenCentral()
maven {
url "http://my.repo.link/"
}
}

dependencies {
// other dependencies
runtime 'my.group:database-project:1.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 建立任务依赖关系来实现类似的事情。

关于spring-boot - 如何从 Gradle 依赖项运行 Flyway 迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com