首页 > 解决方案 > 带有 Gradle 的 Liquibase - changeLogFile 路径的愚蠢问题

问题描述

在我现有的项目中实施 Liquibase 时,我遇到了一个愚蠢但令人讨厌的问题。经过一番努力,我在启动应用程序时让它工作,它通过主变更日志和包含的变更日志/变更集运行。

当我添加 Luquibase Gradle 插件(未来的支持也需要它)时,问题就出现了,因为找不到具有相同路径的更改日志文件。

通过 application.yml 文件中的设置运行应用程序时,更改日志需要:

changeLog: classpath:/db/changelog-master.yml

工作(否则找不到文件),我的变更日志主文件中的路径是:

databaseChangeLog: - include: file: db/changelog/changelog.yml

但是,如果我使用插件命令(例如 changelogSync),则路径需要来自 src,例如:

src/main/resources/db/changelog-master.yml

让插件找到更改日志。

非常感谢能够在启动应用程序和使用插件命令时使用 Liquibase 的一些帮助,但我似乎无法找到解决这个愚蠢问题的方法。

我的活动build.gradle是这样的:

liquibase {
activities {
    main {
        File propsFile = new File("${project.rootDir}/src/main/resources/liquibase.properties")
        Properties properties = new Properties()
        properties.load(new FileInputStream(propsFile))
        changeLogFile properties['changeLogFile']
        url properties['url']
        username properties['username']
        password properties['password'] 
     }
  }
}

application.yml 中的 Liquibase 设置是:

  spring:
   liquibase:
   enabled: true
   changeLog: classpath:/db/changelog-master.yml

必须有一个我似乎找不到的简单解决方案?随意询问更多代码片段,但根据 Liquibase 的文档以及我的设置中的liquibase.propterties文件等,其余部分非常简单。我正在使用 Liquibase 核心 v. 3.8.9 和插件版本 2.0.3。
谢谢。

标签: javaspring-bootgradleliquibasechangelog

解决方案


我无法 100% 理解您的问题,但我认为以下解决方案将为您完成为 liquibase 配置多个类路径的工作

我认为制作以下结构是个好主意:

--src
   -- main
     -- resources
       -- changelogs
          -- migrations1.xml
          -- migrations2.xml
          -- ...
          -- migrationsN.xml
       -- migrations.xml (it's a master changeLog which includes all the other changeLogs)

尝试将相对路径设置为您的子 changeLog 文件,如下所示:

<includeAll path="/changelogs" relativeToChangelogFile="true"/>

includeAll文档的第一个链接中,有一部分是关于为什么使用它不是一个很好的做法

尽管 includeAll 标签有许多有价值的用途,但它的使用可能会导致问题。要避免的最重要的事情是使用 includeAll 标签来模拟 Ruby on Rails 的活动迁移策略,该策略的更改列表,每个文件一个,按文件顺序运行。虽然一开始这似乎是个好主意,但很快就会遇到问题

如果您确实选择使用 includeAll 标记,请确保您有适当的命名策略,以确保您永远不会发生冲突或需要重命名文件以更改以强制重新排序。

所以也许你可以考虑使用<include>标签并列出所有子 changeLog 文件。

例如:

<include path="changelogs/migrations1.xml" relativeToChangelogFile="true"/>
<include path="changelogs/migrations2.xml" relativeToChangelogFile="true"/>
...etc.

推荐阅读