私たちのアプリケーションでは、liquibase を使用します。コマンドラインから(本番環境で手動で)、アプリケーションの起動時に自動的に(テスト環境など)DB移行を実行する必要があります。
問題は、Liquibase がファイル名全体を変更セットの ID の一部と見なすため、パスが異なる場合に変更セットを再適用しようとすることです。たとえば、db-changelog ファイルへの「完全修飾パス」VS「相対パス」の場合。
FILENAME列のチェックを無効にする方法は?
私たちのアプリケーションでは、liquibase を使用します。コマンドラインから(本番環境で手動で)、アプリケーションの起動時に自動的に(テスト環境など)DB移行を実行する必要があります。
問題は、Liquibase がファイル名全体を変更セットの ID の一部と見なすため、パスが異なる場合に変更セットを再適用しようとすることです。たとえば、db-changelog ファイルへの「完全修飾パス」VS「相対パス」の場合。
FILENAME列のチェックを無効にする方法は?
これに基づいて、アプローチは次のようになります。
databaseChangeLog 要素とすべての changeSet 要素の両方で、必ず logicalFilePath 属性を使用してください。
例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog logicalFilePath="does-not-matter" 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-2.0.xsd">
<changeSet logicalFilePath="path-independent" author="authorId" id="1">
...
</changeSet>
</databaseChangeLog>
その結果、すべての変更セットの FILENAME 列に「パスに依存しない」が含まれ、チェックが省略されます。
@snowindyの答えは良いです。別の方法として、com/example/changelog.xml などのクラスパス相対の方法で、いつでも changeLog を参照できます。両方の環境でクラスパスを正しく構成すると、同じ「com/example/changelog.xml」を使用できます。