2015-10-09 29 views
6

Spring Boot's FlywayProperties.java obsługuje wiele ustawień Flyway, ale nie "baselineVersion" ani "baselineOnMigrate". Zamieniam istniejącą aplikację na Flyway i te ustawienia wydają się być zaprojektowane do tego celu. Nasze środowisko produkcyjne jest ściśle kontrolowane i działa tam wersja linii poleceń, aby osiągnąć ten cel, nie jest to praktyczne.Ustawianie linii bazowej "baselineOnMigrate" i "baselineVersion" przy użyciu pliku właściwości rozruchu sprężynowego

Czy tworzenie niestandardowego Flywaya @Bean jest tutaj jedyną opcją?

Odpowiedz

6

Jest to niemożliwe. Spędziłem dzisiaj trochę czasu analizując kod Spring Boot, aby spróbować znaleźć rozwiązanie tego problemu. Nie ma nic o ustawianiu żadnej z tych właściwości w FlywayAutoConfiguration. Odkryłem również, że Spring nigdy nie wywołuje metody configure w obiekcie Flyway, co byłoby jedyną opcją do działania flyway.properties. Spring nieco nadużywa flyway.properties i zamiast dostarczać ten plik dalej do Flywaya, używa go jako źródła właściwości. Dlatego zestaw możliwych opcji podczas korzystania z FlywayAutoConfiguration jest tak ograniczony. Używanie FlywayAutoConfiguration nie jest dobrą opcją, jeśli potrzebujesz bardziej zaawansowanych funkcji Flywaya. Ale używanie @Bean nie jest tutaj tragedią. Poniżej można zobaczyć przykład użycia @Bean w ten sposób, że wdrożenie tego problemu byłoby niemożliwe z dowolnych plików własności:

@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; 
} 

Jak widać mam dwa profile sprężyna. Jedna wartość domyślna, która nie spowoduje wyczyszczenia bazy danych i jedna z pełną czystością bazy danych. Bardzo przydatny.

+0

Dzięki @goroncy dla potwierdzający moje podejrzenia. – dropofahat

0

Po wykopaniu źródła i uruchomieniu niektórych eksperymentów wydaje się, że ponieważ setBaselineVersion() jest przeciążone w klasie Flyway, Spring nie może wstrzyknąć wartości właściwości.

Zmiana na flyway.baselineVersionAsString = 2 działa zgodnie z oczekiwaniami.

4

Udało mi się użyć strategii FlywayMigrationStrategy.

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

Można ustawić dowolny o trasach przelotów właściwościach być poprzedzając je flyway w application.yml/.properties.

Jest to możliwe dzięki org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway, które jest opatrzone przypisami z @ConfigurationProperties(prefix = "flyway").

Jeśli używasz application.yml dodać następujące:

flyway: 
    baselineOnMigrate: true 

przypadku używania application.properties dodać następujące:

flyway.baselineOnMigrate = true 
+1

W rozruchu wiosennym 2 prefiksem jest "spring.flyway", więc właściwość to 'spring.flyway.baselineOnMigrate = true' – pdem