2016-08-08 47 views
1

Gemäß der Dokumentation Liquibase:Liquibase: Wie identifiziert man nur die Change-Set-Basis-ID?

Jeder ChangeSet Tag durch die Kombination der „id“ Tag, der „Autor“ Tag und der Changelog-Datei Classpath Namen identifiziert wird.

Dies scheint eine sehr schlechte Design-Wahl zu sein. Die Identität eines Änderungssets sollte nicht mit seinem Standort verknüpft sein. Wenn das Änderungsprotokoll über die automatische Anwendungsbereitstellung ausgeführt wird, würde das Änderungsset von einem Klassenpfad innerhalb einer JAR-Datei kommen. Wenn ich die gleichen Änderungssätze manuell von der Befehlszeile aus ausführen möchte, kann der Speicherort das aktuelle Verzeichnis sein.

In diesem Fall versucht Liquibase, anstatt den Changeset anhand seiner ID zu erkennen, zweimal. Gibt es eine Möglichkeit, dieses Verhalten zu ändern und Änderungssets nur anhand der angegebenen ID zu identifizieren?

Antwort

3

Ich würde vorschlagen, das logicalFilePath Attribut von databaseChangeLog Tag zu verwenden.

Dies gibt Ihnen mehr Freiheit, die Verzeichnisstruktur Ihres Projekts zu ändern. Es verhindert auch, dass der Dateiname als absoluter Pfad gespeichert wird (was unter Umständen passieren kann).

+0

Dies scheint jedoch nur mit XML-Änderungsprotokollen verwendbar zu sein. Wissen Sie, ob es mit SQL Changelogs verwendet werden könnte? –

+0

Nein, soweit ich weiß. – binoternary

0

Nur wenn Sie den Quellcode manipulieren und Ihre eigene Version von liquibase neu kompilieren.

Eigentlich ist das Design in Ordnung, Sie verwenden es einfach falsch. Wenn Sie e. G. Haben Sie ein großes Team, in dem jedes Team seine Changesets in einer separaten liquibase-Datei verwaltet, wäre es fatal, den Dateinamen nicht zu berücksichtigen, da verschiedene Teams dieselbe ID verwenden könnten.

Stellen Sie sicher, dass Sie Liquibase immer auf die gleiche Weise aufrufen und die Identitäten der Changesets nicht ändern.

+0

Ich stimme nicht überein, dass die Verwendung von Pfad ist eine gute Design-Wahl für die Identifizierung. In einem großen Team sollte Autor + ID ausreichen, um Änderungen zu identifizieren. Wenn nicht, könnte eine Konvention für eine ID wie eine umgekehrte Domäne oder ein Projektname angenommen werden. Und zuletzt nur der Dateiname ohne Pfad. Aber du hast recht, es scheint keine Möglichkeit zu geben, dieses Verhalten zu ändern, ohne es neu zu kompilieren. –

1

@ Binoternarys Antwort funktioniert. Aber das Problem ist, dass logicalFilePath nur in XML-Änderungsmengen verfügbar ist, während ich SQL-Änderungsmengen verwendete. Die Arbeit ist um ein XML-Änderungsset zu erstellen und dann SQL in es wie folgt einfügen:

<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.4.xsd"> 

    <changeSet id="new-tables" author="kshitiz" logicalFilePath="new_tables.sql"> 
     <sqlFile path="new_tables.sql" relativeToChangelogFile="true" /> 
    </changeSet> 
</databaseChangeLog>