7

flyway の gradle プラグインを使用して移行を管理したい 2 つのデータベースがあります。

両方のデータベースを移行できる単一のタスクが必要です。ただし、flywayMigrate タスクを 1 つのタスクから 2 回呼び出すことはできないようです。

これが私が持っているものです...

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']) {}

コマンド ラインから migrateFoo または migrateBar を明示的に呼び出すと問題なく動作しますが、migrate タスクを呼び出そうとすると、データベース foo のみが更新されます。

migrateBar タスクの doFirst タスクと doLast タスクの両方が呼び出されますが、tasks.flywayMigrate.execute() タスクは、migrateBar から 2 回目に呼び出されることはありません。

flyway で単一のタスクから foo と bar の両方を移行するにはどうすればよいですか?

4

2 に答える 2

2

まず、execute()タスクを呼び出すべきではありません (悪いことが起こります)。また、タスクは Gradle の呼び出しごとに最大 1 回実行されます。

あなたの質問に答えるために、どうやら flyway プラグインは同じタイプの複数のタスクを持つことをサポートしていません。その実装を見ると、自分のタスクをロールバックする必要があると思います。何かのようなもの:

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)

同じタイプの複数のタスクをサポートする機能リクエストを提出し、それらを簡単に構成することをお勧めします。

于 2013-08-09T07:46:34.313 に答える
0

私も同じ問題を抱えていました。異なるデータベースに対してフライウェイ移行を実行したかったのですが、ONE gradle ビルドで異なる構成の同じデータベースに対しても実行したかったのです。データベースごとに、通常のデータ テーブルと静的データ テーブルを移行する必要があるため、2 つの Flyway バージョン テーブルとスクリプト用の 2 つの場所を使用します。例えば

ENV: dev MIGRATION1: data   (locations: db/scripts/data   table: _flyway_version_data)
         MIGRATION2: static (locations: db/scripts/static table: _flyway_version_static) 

ENV: test MIGRATION1 ....
          MIGRATION2 ....

ピーターが上で述べたように、フライウェイ タスクは、どれだけ頻繁に呼び出しても 1 回しか実行されません。

私が見つけた回避策は最も良いとは思えませんが、うまくいきます:

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)

基本的に、構成ごとに新しいgradleビルドを作成します。

"buildFile = 'build.gradle'"

はそれ自体を参照するため、すべてのコードが 1 つの build.gradle ファイルに含まれています。gradle 呼び出しは次のとおりです。

gradle migrateFlywayDevData migrateFlywayDevStatic ...

これは最初のバージョンです。そのため、コードは簡単に改善される可能性があります。ただし、このソリューションでは、1 回の gradle 呼び出しで flyway タスクを複数回実行できます。

お気軽にコメントしてください (flyway プラグインの構成はここには示されていません)

于 2013-11-21T20:14:29.227 に答える