簡體   English   中英

帶有 Gradle 的 Liquibase - changeLogFile 路徑的愚蠢問題

[英]Liquibase with Gradle - silly problem with changeLogFile path

在我現有的項目中實施 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文件等,rest 非常簡單。 我使用的是 Liquibase 核心版本 3.8.9 和插件版本 2.0.3。
謝謝。

我無法 100% 理解您的問題,但我認為以下解決方案將為您完成為 liquibase 配置多個 class 路徑的工作

我認為制作以下結構是個好主意:

--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 Active Migrations 策略的更改列表,每個文件一個,按文件順序運行。 雖然一開始這似乎是個好主意,但很快就會遇到問題

如果您確實選擇使用 includeAll 標記,請確保您有適當的命名策略,以確保您永遠不會發生沖突或需要重命名文件以更改以強制重新排序。

所以也許您可以考慮使用<include>標記並列出所有子 changeLog 文件。

例如:

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

我可以遲來提供我發現的解決方法。 我遇到了與您描述的類似的問題,我已在Liquibase 社區中詳細記錄了這些問題。 我正在使用 liquibase 版本 4.3.2 和 Gradle 插件 2.0.3。

在我的示例中,我使用的是 a.xml 主控,包括 mysql.sql 文件

./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 主文件后,我能夠運行更新而不會與類路徑前綴發生任何沖突,即使類路徑前綴僅用於 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"

但是,如果我使用插件命令(例如 changelogSync),則路徑需要來自 src,例如:

要解決此問題,您可以在 Gradle 運行的 Liquibase 任務中配置類路徑基目錄。

這將確保在剝離此基本路徑后相對路徑匹配:

/src/主要/資源/ 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"
     }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM