Как запустить миграцию Flyway из зависимости от Gradle? - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть два веб-сервиса Spring Boot, которые должны использовать одну и ту же базу данных, одну и ту же схему и одни и те же таблицы - одна служба читает из таблиц, а другая записывает в них.В данный момент одна из служб находится в разработке и работает с БД в памяти вместо реальной БД, поэтому я могу сделать так, чтобы каждая служба содержала свою собственную копию миграций базы данных.Как только обе службы работают с одной и той же БД, это не сработает - первая, которая запустится, выполнит миграцию, а другая потерпит неудачу.Но оба проекта по-прежнему нуждаются в миграции, поскольку они необходимы для создания баз данных в памяти для автоматических тестов.

В качестве решения я делаю третий проект, единственной обязанностью которого будет запускмиграции, и оба исходных приложения извлекут миграцию из этого нового, но я застрял на том, как это сделать.

Самое близкое, что мне нужно, это то, что я видел, это код из другой вопрос SO :

sourceSets {
    main {
        resources {
            srcDirs += [
                project(':data').sourceSets.main.resources
            ]
        }
    }
}

Но это для включения ресурсов из другого локального проекта, а не из зависимости gradle.У меня есть мой личный репозиторий Maven, и зависимость разрешена, но я нахожусь в тупике, что писать вместо внутренней строки этого блока выше.

repositories {
    mavenCentral()
    maven {
        url "http://my.repo.link/"
    }
}

dependencies {
    // other dependencies 
    runtime 'my.group:database-project:1.0'
}

1 Ответ

0 голосов
/ 19 сентября 2019

Если вы используете макет мультипроекта Gradle и хотите использовать плагин Flyway, я думаю, вы можете просто настроить папку миграции напрямую.Примерно так:

flyway {
  locations = ["filesystem:$rootDir/data/migrations"]
}

Если вы используете автономные проекты, вы можете упаковать свои миграции в файл jar с помощью плагина java, опубликовать его в репозитории Maven и сделать нормальную зависимость отэто.Если вы не хотите помещать свои миграции в путь к классам приложения, вы можете поместить зависимость в пользовательскую конфигурацию.А если у вас нестандартная структура папок, вы можете настроить это с помощью значения classpath: в параметре locations.Примерно так:

configurations {
    flywayMigration
}

dependencies {
    flywayMigration "com.group:database-project:1.0" // Jar file containing your migration scripts
}

flyway {
    configurations = ["flywayMigration"]
    locations = ["classpath:db/migrations"]
}

Если я неправильно понимаю ваши требования, вам не нужен сторонний проект для применения миграций.(Хотя вы все еще можете, если хотите, по причине.) В моем проекте мы находимся в аналогичной ситуации, и у нас есть все наши приложения Spring Boot, которые связывают скрипты миграции с ними, а затем при запуске мы проблематично применяем миграциив базу данных.В этом сценарии в чистой базе данных первое приложение выполнит все миграции, а все последующие просто подтвердят, что все в порядке.Flyway также поддерживает параллельные миграции, поэтому проблем с параллелизмом быть не должно.Вы можете добиться аналогичного результата, применив подключаемый модуль Flyway ко всем загрузочным проектам, а затем установите зависимость задачи от bootRun до flywayMigrate.

...