2017-09-18 127 views
0

我有這些gradle這個任務:
- startTestDatabaseContainer:建立與數據庫
啓動泊塢窗容器 - removeTestDatabaseContainer:停止並刪除泊塢窗容器
- flywayValidate:從org.flywaydb.flyway任務是驗證我的移民文件我應該如何構建這些gradle任務依賴關係?

我希望按順序執行這三項任務。閱讀this使我這個解決方案:

flywayValidate.dependsOn startTestDatabaseContainer 
flywayValidate.finalizedBy removeTestDatabaseContainer 

該工程確定,但我不能沒有startTestDatabaseContainerremoveTestDatabaseContainer也被調用運行在命令行gradle flywayValidate。我希望能夠在沒有這種情況下運行flywayValidate

當我無法在gradle中定義依賴關係時,我能做些什麼來完成此任務?

我第一次嘗試很乾脆:

task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayValidate 
    finalizedBy removeTestDatabaseContainer 
} 

但失敗,因爲flywayValidate可以startTestDatabaseContainer之前運行。

編輯:我在Opal的解決方案這裏設置了示範基地:github.com/stianlagstad/flyway-migration-error-causes-final-gradle-task-to-not-execute。克隆它並運行gradle validateMigration。遷移將失敗,最終的gradle任務將不會運行(並且docker ps將顯示容器仍在運行)。如果你修復了遷移文件,那麼一切都按預期工作。我相信我誤解了一些東西。任何指針都會有幫助!

回答

0
task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayMigrate 
    flywayMigrate.finalizedBy removeTestDatabaseContainer 
    flywayMigrate.mustRunAfter startTestDatabaseContainer 
} 

這個伎倆!謝謝orzeh for the PR on Github,謝謝Opal的幫助!

1

下面的設置應滿足您的所有需求:

task startTestDatabaseContainer { 
    doLast { 
    println 'startTestDatabaseContainer' 
    } 
} 
task flywayValidate { 
    doLast { 
    println 'flywayValidate' 
    } 
} 
task removeTestDatabaseContainer { 
    doLast { 
    println 'removeTestDatabaseContainer' 
    } 
} 

task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayValidate 
    flywayValidate.mustRunAfter startTestDatabaseContainer 
    finalizedBy removeTestDatabaseContainer 
} 

編輯

task removeTestDatabaseContainer { 
    doLast { 
    println 'removeTestDatabaseContainer' 
    } 
} 

task startTestDatabaseContainer { 
    doLast { 
    println 'startTestDatabaseContainer' 
    } 
    finalizedBy removeTestDatabaseContainer 
} 

task flywayValidate { t-> 
    doLast { 
    println 'flywayValidate' 
    throw new TaskExecutionException(t, new RuntimeException('whatever')) 
    } 
} 

task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayValidate 
    flywayValidate.mustRunAfter startTestDatabaseContainer 
} 

Here的演示。

+0

謝謝!我遇到了另一個問題:當遷移失敗時,removeTestDatabaseContainer任務沒有運行(我通過添加一個doLast並使用println +看到docker容器仍在運行來證實這一點)。如果我在'validateMigration'任務中移除了兩行'flywayValidate',那麼'removeTestDatabaseContainer'已成功運行。你有什麼建議嗎? – L42

+0

@ L42,見編輯答案。 – Opal

+0

再次感謝您。但是,它看起來並不像調用removeTestDatabaseContainer。我將編輯我的原始問題,向您展示編輯中代碼的輸出結果。 – L42