2015-10-09 10 views
6

Flyway FlywayProperties.java supporta molte delle impostazioni Flyway ma non "baselineVersion" o "baselineOnMigrate". Sto convertendo un'applicazione esistente in Flyway e queste impostazioni sembrano essere progettate per questo scopo. Il nostro ambiente di produzione è altamente controllato e l'esecuzione di una versione a linea di comando di flyway per raggiungere questo obiettivo non è pratica.Impostazione Flyway 'baselineOnMigrate' e 'baselineVersion' utilizzando il file delle proprietà di avvio primavera

La creazione di una Flyway personalizzata @Bean è l'unica opzione qui?

risposta

6

È impossibile. Ho passato un po 'di tempo oggi analizzando il codice di Spring Boot per cercare di trovare una soluzione a questo. Non c'è nulla nell'impostazione di nessuna di queste proprietà in FlywayAutoConfiguration. Inoltre ho scoperto che Spring non chiama mai il metodo configure sull'oggetto Flyway quale sarebbe l'unica altra opzione per il funzionamento di flyway.properties. Spring sta abusando un po 'di flyway.properties e invece di fornire questo file oltre a Flyway, lo usano come fonte di proprietà. Questo è il motivo per cui l'insieme di opzioni possibili quando si utilizza FlywayAutoConfiguration è così limitato. Quindi, usare FlywayAutoConfiguration non è una buona opzione se hai bisogno di altre funzionalità avanzate di Flyway. Ma usare @Bean non è una tragedia qui. Qui di seguito è possibile visualizzare un esempio di utilizzo di @Bean in questo modo che l'implementazione di questo comportamento sarebbe impossibile con qualsiasi file di proprietà:

@Profile(value = "!dbClean") 
@Bean(name = "flyway", initMethod = "migrate") 
public Flyway flywayNotADestroyer() { 
    Flyway flyway = new Flyway(); 
    flyway.setDataSource(dataSource()); 
    flyway.setBaselineOnMigrate(true); 
    return flyway; 
} 

@Profile(value = "dbClean") 
@Bean(name = "flyway", initMethod = "migrate") 
public Flyway flywayTheDestroyer() { 
    Flyway flyway = new Flyway(); 
    flyway.setDataSource(dataSource()); 
    flyway.setBaselineOnMigrate(true); 
    flyway.clean(); 
    return flyway; 
} 

Come potete vedere ho due profili sorgente qui. Un valore predefinito che non pulirà il database e uno con la pulizia completa del database. Molto maneggevole.

+0

Grazie @goroncy per la conferma il mio sospetto. – dropofahat

0

Dopo aver scavato nella sorgente ed eseguito alcuni esperimenti, sembrerebbe che poiché setBaselineVersion() è sovraccarico nella classe Flyway, Spring non è in grado di iniettare il valore della proprietà.

Passaggio a flyway.baselineVersionAsString = 2 funziona come desiderato.

4

Ho avuto successo utilizzando una FlywayMigrationStrategy.

@Component 
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy { 
    @Override 
    public void migrate(Flyway flyway) { 
     flyway.setBaselineOnMigrate(true); 
     flyway.migrate(); 
    } 
} 
5

È possibile impostare qualsiasi di flyways proprietà loro essere anteponendo flyway nel vostro application.yml/.properties.

E 'reso possibile da org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway che è annotato con @ConfigurationProperties(prefix = "flyway").

Se si utilizza un application.yml aggiungere il seguente:

flyway: 
    baselineOnMigrate: true 

Se si utilizza un application.properties aggiungere il seguente:

flyway.baselineOnMigrate = true 
+1

Nel boot di primavera 2 il prefisso è "spring.flyway", quindi la proprietà è 'spring.flyway.baselineOnMigrate = true' – pdem

Problemi correlati