2016-10-20 7 views
1

DB MigrationのためにFlywayをテストしたところ、その機能とワークフローには驚いています。Gradle:環境やその他のプロパティに応じて、プラグインサブタスクを実行不可能にマークしてください。

Flywayでも、アクセスしているスキーマからすべてのテーブルとプロシージャを効果的に削除するcleanタスクを実行できます。

このサブタスクは、開発環境では実行可能であるが、実稼働環境では実行できないようにする必要があります。誤ってその意味を誤解し、誤って本番DBを強制終了する可能性があります。

プラグインのサブタスクを無効にする(または単に削除する)ことはできますか?私のような何かを行うことができます。

flywayClean { 
    enabled = project.hasProperty('devenv') 
    if(!enabled) { 
     throw new StopExecutionException("Disabled on production servers.") 
    } 
} 

をしかし残念ながら、これは完了することから、ビルドを停止します。理想的には、タスクが特に別のタスクまたはコマンドラインから実行されている場合は、のような例外をスローしたいと思います。

Gradleでこれを行うことはできますか?


EDIT

はまもなく質問を投稿した後、私はflyway設定オプションはまた、私が望んで正確に何ができるcleanDisabledオプションが含まれていることに気づきました。しかし、質問を削除する必要はありません:プラグイン自体にこのようなオプションがない場合、これは一般的に可能ですか?

答えて

1

はい、Gradleの各タスクには、タスクの実行時に実行されるクロージャのリストがあります。 'doFirst'クロージャを追加することで、そのリストの先頭に任意のクロージャを追加できます。

有効な変数は使用しないで、プロパティを直接チェックしてください。そうでない場合は

タスクが実行を開始した後にタスク 'flywayClean'を呼び出すことができません。

完全な実行を失敗させたい場合は、StopExecutionExceptionは現在のタスクが残りのタスククロージャをエラーメッセージなしで実行するのを止めるだけです。

flywayClean { 
    doFirst{ 
     if(!project.hasProperty('devenv')) { 
      throw new Exception("Disabled on production ervers.") 
     } 
    } 
} 

オルタナティブ:これを行うには

もう一つの方法は、条件に基づいてタスクをスキップすることです。ここでは、タスクの実行を開始していないため、有効な変数を変更できます。ユーザーに理由を印刷して、タスクがスキップされた理由を理解するようにしてください。

gradle.taskGraph.whenReady { taskGraph -> 
    if (!project.hasProperty('devenv')){ 
     taskGraph.allTasks.find {it.name == 'flywayClean'}.each{ 
      println 'Disabling flywayClean due to missing property "devenv"' 
      it.enabled = false 
     } 
    } 
} 
関連する問題