Spring Boot 带有Gradle的Liquibase-changeLogFile路径存在愚蠢问题

iqjalb3h  于 2023-01-30  发布在  Spring
关注(0)|答案(3)|浏览(164)

在我现有的项目中实现Liquibase时,我遇到了一个愚蠢但恼人的问题。经过一番努力,我让它在启动应用程序时工作起来,它运行在主更改日志和包含的更改日志/更改集中。
然后,当我添加Luquibase Gradle插件(将来的支持也需要该插件)时,由于找不到具有相同路径的更改日志文件,问题发生了。
通过application.yml文件中的设置运行应用程序时,变更日志需要:

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

工作(否则找不到文件),我的changelog-master文件中的路径是:
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'] 
     }
  }
}

应用程序.yml中的Liquibase设置为:

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

一定有一个简单的解决方案,我只是似乎找不到?随意要求更多的代码片段,但其余的是相当简单的根据文档从Liquibase与liquibase.propterties文件等在我的设置。我使用Liquibase核心v. 3.8.9和插件版本2.0.3。
谢谢。

zz2j4svz

zz2j4svz1#

我不能理解你的问题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.
nnvyjq4y

nnvyjq4y2#

我可以提供一个我已经找到的解决方案。我遇到了一个与您描述的类似的问题,我在Liquibase community中详细描述了这个问题。我使用的是liquibase版本4.3.2和Gradle插件2.0.3。
在我的示例中,我使用了一个包含mysql.sql文件的.xml主文件

./src
└── main
    ├── java
    └── resources
        ├── application.properties
        └── db
            └── changelog
                ├── init
                │   ├── 1-0-table.mysql.sql
                │   └── 1-0-view.mysql.sql
                └── master.xml

master.xml

<?xml version="1.0" encoding="UTF-8"?>   
<databaseChangeLog  
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">  

  <include  file="init/1-0-table.mysql.sql"
            relativeToChangelogFile="true" />

  <include  file="init/1-0-view.mysql.sql"
            relativeToChangelogFile="true"
            context="!test"/>

</databaseChangeLog>

在移动到包含.yml文件的.yml master之后,我已经能够运行更新,而不会与类路径前缀发生任何冲突,尽管类路径前缀只在Spring中使用。

./src
└── main
    ├── java
    └── resources
        ├── application.properties
        └── db
            └── changelog
                ├── init
                │   ├── 1-0-table.yml
                │   └── 1-0-view.yml
                └── master.yml

master.yml

databaseChangeLog:
  - include:
      file: init/1-0-table.yml
      relativeToChangelogFile: true
  - include:
      file: init/1-0-view.yml
      relativeToChangelogFile: true
      context: "!test"
2uluyalo

2uluyalo3#

但是如果我使用插件命令(例如changelogSync),路径需要来自src,例如:
要解决此问题,您可以在Gradle运行的Liquibase任务中配置类路径基目录。
这将确保在去除此基本路径后相对路径匹配:
/源代码/主/资源/db/changelog/changelog.yml=db/changelog/changelog.yml
此外,它还解决了 * 明确指出"Build.Gradle"中的changlogFile后 * 迁移复制的问题
完整配置应如下所示(适用于您的情况):

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']
        classpath "${projectDir}/src/main/resources"
     }
  }
}

相关问题