2013-08-08 5 views
6

Wir haben zwei Datenbanken, für die wir ihre Migrationen mit dem groway Plugin von Flyway verwalten möchten.Verwalten Sie mehrere Datenbanken mit dem Migrations-Plugin von Flyway migrations

Ich möchte eine einzelne Aufgabe haben, die beide Datenbanken migrieren kann. Allerdings kann ich die Aufgabe "flywayMigrate" nicht zweimal von einer einzelnen Task abrufen.

Hier ist, was ich habe ...

task migrateFoo() { 
    doFirst { 
     flyway { 
      url = 'jdbc:mysql://localhost/foo' 
      user = 'root' 
      password = 'password' 
      locations = ['filesystem:dev/src/db/foo'] 
      sqlMigrationPrefix = "" 
      initOnMigrate = true 
      outOfOrder = true 
     } 
    } 
    doLast { 
     tasks.flywayMigrate.execute() 
    } 
} 

task migrateBar() { 
    doFirst { 
     flyway { 
      url = 'jdbc:mysql://localhost/bar' 
      user = 'root' 
      password = 'password' 
      locations = ['filesystem:dev/src/db/bar'] 
      sqlMigrationPrefix = "" 
      initOnMigrate = true 
      outOfOrder = true 
     } 
    } 
    doLast { 
     tasks.flywayMigrate.execute() 
    } 
} 

task migrate(dependsOn: ['migrateFoo','migrateBar']) {} 

Explizit entweder migrateFoo oder migrateBar von der Kommandozeile funktioniert gut, aber anrufen, wenn ich versuche, die Migrate Aufgabe rufen nur Datenbank foo aktualisiert wird.

Die DoFirst- und DoLast-Tasks der migrateBar-Task werden zwar aufgerufen, die Task tasks.flywayMigrate.execute() wird jedoch nicht zum zweiten Mal von migrateBar aufgerufen.

Wie kann ich über Flyway foo und bar von einer einzigen Aufgabe migrieren?

Antwort

2

Zuerst sollten Sie niemals execute() für eine Aufgabe aufrufen (schlimme Dinge passieren). Eine Aufgabe wird höchstens einmal pro Gradle-Aufruf ausgeführt.

Um Ihre Frage zu beantworten, unterstützt das Flyway-Plugin offensichtlich nicht mehrere Aufgaben des gleichen Typs. Wenn man sich die Implementierung anschaut, muss man wohl seine eigene Aufgabe aufstellen. Etwas wie:

import com.googlecode.flyway.core.Flyway 
import org.katta.gradle.plugin.flyway.task.AbstractFlywayTask 

class MigrateOtherDb extends AbstractFlywayTask { 
    @Override 
    void executeTask(Flyway flyway) { 
     // set any flyway properties here that differ from 
     // those common with other flyway tasks 
     println "Executing flyway migrate" 
     flyway.migrate() 
} 

task migrateOtherDb(type: MigrateOtherDb) 

Ich empfehle eine Feature-Anfrage ein, mehrere Aufgaben des gleichen Typs zu unterstützen, mit einem bequemen Weg, um sie zu konfigurieren.

+0

Haben Sie einen guten Zeiger haben in der Dokumentation, wie dies zu implementieren? –

+0

Grundsätzlich müssen die Aufgabenklasse (n) alle Eigenschaften (oder mehr) der Erweiterung deklarieren, wobei die Erweiterungseigenschaften als Standardwerte verwendet werden. Sehen Sie sich die Code-Qualität-Plugins in der Gradle-Codebase an (z. B. "CheckstylePlugin" oder "FindbugsPlugin"). Per Konvention haben konkrete Aufgabenklassen in ihrem Namen keine "Aufgabe". –

+0

OK, danke, ich werde mich darum kümmern. BTW, Jeremy benutzt dieses Plugin hier: https://github.com/flyway/flyway/tree/master/flyway-gradle-plugin –

0

Ich hatte auch das gleiche Problem. Ich wollte die Migration von Flugwegen für verschiedene Datenbanken und sogar für die gleiche Datenbank mit verschiedenen Konfigurationen in ONE-Gradle-Build durchführen. für jede Datenbank muss ich normale Datentabellen und statische Datentabellen migrieren, also verwende ich zwei Flyway-Versionstabellen und auch zwei Standorte für die Skripte. Z.B.

Wie Peter oben erklärt, werden die Zugwegaufgaben nur EINMAL ausgeführt, egal wie oft sie aufgerufen werden.

Die Abhilfe i scheinen nicht gefunden schönsten zu sein, aber es funktioniert:

in build.gradle

task migrateFlywayDevData(type: GradleBuild) { 
    buildFile = 'build.gradle' 
    tasks = ['flywayMigrate'] 
    startParameter.projectProperties = [env: "dev", type="data"] 
} 

task migrateFlywayDevStatic(type: GradleBuild) { 
    buildFile = 'build.gradle' 
    tasks = ['flywayMigrate'] 
    startParameter.projectProperties = [env: "test", type="static"] 
} 
....(task defs for test env) 

Grundsätzlich erstelle ich eine neue gradle Build für jede der Konfigurationen.

"buildFile = 'build.gradle'"

bezieht sich auf sich selbst, so dass alle Code wird in einer build.gradle Datei enthalten. Der gradle Anruf ist dann:

gradle migrateFlywayDevData migrateFlywayDevStatic ... 

Dies ist die erste Version. So könnte Code leicht verbessert werden. Mit dieser Lösung können Sie jedoch mehrfach mit einem einzigen Callway-Aufruf Aufgaben ausführen.

Fühlen Sie sich frei zu äußern (flyway Plugin-Konfiguration hier nicht dargestellten)

Verwandte Themen