2017-09-25 12 views
5

मैं केवल एक विशिष्ट कार्य के लिए काम करने के लिए ग्रैडल के mustRunAfter और finalizedBy प्राप्त करने का प्रयास कर रहा हूं। इस उदाहरण build.gradle लें:Gradle's mustRunAfter/finalized केवल एक विशिष्ट कार्य के लिए?

task removeTestDatabaseContainer { 
    doLast { 
    println '\ninside removeTestDatabaseContainer\n' 
    } 
} 

task startTestDatabaseContainer { 
    doLast { 
    println '\ninside startTestDatabaseContainer\n' 
    } 
    finalizedBy removeTestDatabaseContainer 
} 

task flywayMigrate { t-> 
    doLast { 
    println '\n inside flywayMigrate\n' 
    } 
} 

task flywayClean { t-> 
    doLast { 
    println '\n inside flywayClean\n' 
    } 
} 

task testEverything { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayMigrate 
    dependsOn flywayClean 

    flywayMigrate.mustRunAfter startTestDatabaseContainer 
    flywayMigrate.finalizedBy flywayClean 

    flywayClean.mustRunAfter flywayMigrate 
    flywayClean.finalizedBy removeTestDatabaseContainer 
} 

मैं कैसे testEverything काम करता है के साथ खुश हूँ। मैं उत्पादन मुझे लगता है कि काम से हो रही है चाहते हैं:

➜ gradle testEverything 
Parallel execution is an incubating feature. 
:startTestDatabaseContainer 

inside startTestDatabaseContainer 

:flywayMigrate 

inside flywayMigrate 

:flywayClean 

inside flywayClean 

:removeTestDatabaseContainer 

inside removeTestDatabaseContainer 

:testEverything 

BUILD SUCCESSFUL 

Total time: 0.597 secs 

हालांकि, जब मैं केवल flywayMigrate मैं अप्रत्याशित समस्याओं मिल चलाते हैं।

➜ gradle flywayMigrate     
Parallel execution is an incubating feature. 
:flywayMigrate 

inside flywayMigrate 

:flywayClean 

inside flywayClean 

:removeTestDatabaseContainer 

inside removeTestDatabaseContainer 


BUILD SUCCESSFUL 

Total time: 0.605 secs 

यह आउटपुट मैं चाहता हूँ नहीं है: यह उत्पादन होता है। मुझे चलाने के लिए केवल flywayMigrate चाहिए। प्रश्न 1) मैं testEverything कैसे काम कर सकता हूं और साथ ही gradle flywayMigrate केवल flywayMigrate-टास्क का आह्वान कर सकता है?

प्रश्न 2)
मुझे बताया गया हूँ इस तथ्य यह है कि task testEverything {} के कोष्ठक के अंदर सब कुछ विन्यास है, जो हमेशा Gradle द्वारा संसाधित है के साथ क्या करने के लिए कुछ नहीं है। तो किसी भी mustRunAfter/finalizedBy मैं एक कार्य के भीतर सेट "वैश्विक प्रभाव" होगा। लेकिन उस मामले में, gradle flywayMigrate क्यों नहीं startTestDatabaseContainer का आह्वान करता है? (क्योंकि लाइन flywayMigrate.mustRunAfter startTestDatabaseContainertestEverything कार्य के अंदर की।)

संपादित करें: मैं Gradle दस्तावेज में Ordering tasks और Finalizer tasks करने के लिए निर्देशित किया गया था और वे सवाल 2 का जवाब: mustRunAfter ही लागू होती है जब दोनों कार्यों को दौड़ा रहे हैं। दूसरी तरफ finalizedBy प्रभावी होता है जब केवल उस कार्य को सेट किया जाता है। यह जवाब देता है कि flywayClean और removeTestDatabasContainer चलाए जाते हैं जब मैं gradle flywayMigrate निष्पादित करता हूं।

मैं अभी भी gradle testEverything काम करने के लिए संघर्ष कर रहा हूं जैसा कि ऊपर है और साथ ही को flywayMigrate निष्पादित करने के लिए भी मिलता है।

उत्तर

1

फ्रीनोड पर #gradle पर एस्कैटोस की मदद के लिए धन्यवाद मुझे एक समाधान मिला। यह केवल अंतिमकृत लाइनों को हटाने के लिए था। अपडेट किया गया build.gradle जो काम करता है:

task removeTestDatabaseContainer { 
    doLast { 
    println '\ninside removeTestDatabaseContainer\n' 
    } 
} 

task startTestDatabaseContainer { 
    doLast { 
    println '\ninside startTestDatabaseContainer\n' 
    } 
    finalizedBy removeTestDatabaseContainer 
} 

task flywayMigrate { t-> 
    doLast { 
    println '\n inside flywayMigrate\n' 
    } 
} 

task flywayClean { t-> 
    doLast { 
    println '\n inside flywayClean\n' 
    } 
} 

task testEverything { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayMigrate 
    dependsOn flywayClean 

    flywayMigrate.mustRunAfter startTestDatabaseContainer 
    //flywayMigrate.finalizedBy flywayClean 

    flywayClean.mustRunAfter flywayMigrate 
    //flywayClean.finalizedBy removeTestDatabaseContainer 
} 
संबंधित मुद्दे