कस्टम कार्य जो कई कार्यों को चलाता है


81

मैं एक के रूप में कई ग्रेडल कार्यों को चलाना चाहता हूं। इसलिए इसके बजाय

./gradlew clean build publish

मैं एक कस्टम कार्य करना चाहता हूं

./gradlew cleanBuildPublish

यह क्रियान्वित clean buildऔर publishक्रम में है।

यह कैसे संभव है?

यह काम नहीं करता

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}

क्या आप जावा प्लगइन का उपयोग कर रहे हैं?
संतोष गोकक

@SantoshGokak हाँ मैं करता हूँ
निकलस

जवाबों:


113

यदि आपको पूर्वनिर्धारित क्रम में कुछ कार्यों को निष्पादित करने की आवश्यकता है, तो आपको न केवल सेट करने की आवश्यकता है dependsOn , बल्कि mustRunAfterइस कार्य के लिए संपत्ति निर्धारित करने की भी है, जैसे कि निम्नलिखित कोड में:

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
    tasks.findByName('build').mustRunAfter 'clean'
    tasks.findByName('publish').mustRunAfter 'build'
}

dependsOnकार्य निष्पादन के एक क्रम को परिभाषित नहीं करता है, यह सिर्फ एक कार्य को दूसरे से निर्भर mustRunAfterकरता है , जबकि करता है।


क्या इसके साथ अभी भी पूरी तरह से कार्यों को निष्पादित करना संभव होगा?
निकोलस

17
मुझे यह त्रुटि मिलती हैCannot invoke method mustRunAfter() on null object
निकल्स

1
एक और, आपके क्लीनबाइल्डप्रकाशीय कार्य को आपकी बिल्ड स्क्रिप्ट में सभी 3 आश्रित कार्यों के बाद रखा जाना चाहिए
स्टैनिस्लाव

1
cleanBuildPublishसभी व्यक्तिगत कार्यों को परिभाषित किया गया है के बाद रखना सुनिश्चित करें । लगता है कि ढाल के कार्यों को ऊपर से नीचे तक पढ़ा जाता है। इसने मेरी समस्या को हल कर दियाCannot invoke method mustRunAfter() on null object
baskInminmin

2
यह उल्लेख करने के लिए महत्वपूर्ण है कि एंकल कार्य समाप्त करने के लिए इंतजार नहीं करता है
मॉन्ट्रियल

96

आप टास्क बेस क्लास भी कह सकते हैं GradleBuild

यहाँ आप इसके साथ कैसे कर सकते हैं GradleBuild

task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}

1
इस कार्य का उल्लेख अनुक्रम में किया जाएगा?
मंगेश कदम

1
इसके kotlin संस्करण?
मणि

कोटलिन संस्करण बहुत समान होगा। आप बस project.tasks.registerअपने कार्य को बनाने के लिए उपयोग करना चाहते हैं और यह सब है।
तस्मानी


4

यदि प्रकाशन कार्य उपप्रोजेक्ट नाम की उप परियोजना में है,

...
tasks.findByPath(':subProjectName:publish').mustRunAfter 'build'
...

3

CleanBuildPublish को अन्य कार्यों पर निर्भर करने के लिए नीचे दिए गए तरीके आज़माएं

build.gradle

task clean{
    println "lets clean"
}

task build {
    println "lets build"
}

task publish {
    println "lets publish"
}

task cleanBuildPublish{
    println 'lets do all'
}


cleanBuildPublish.dependsOn clean
cleanBuildPublish.dependsOn build
cleanBuildPublish.dependsOn publish

उत्पादन

$ gradle cleanBuildPublish
lets clean
lets build
lets publish
lets do all
:build UP-TO-DATE
:clean UP-TO-DATE
:publish UP-TO-DATE
:cleanBuildPublish UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.738 secs

जाँच https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask अधिक जानकारी के लिए


1
अभी भी नहीं है। आउटपुट: pastebin.com/8knNfLEY ग्रेड कार्य pastebin.com/NaHhdRkA
निकोलस

कृपया अपनी बिल्ड.ग्रेडल फ़ाइल
संतोष गोकक

प्रोजेक्ट: pastebin.com/4uN9Usvd कैलेंडर मॉड्यूल: pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Niklas


0

यहाँ है कि मैंने इसे कैसे किया, कोटलिन स्क्रिप्टिंग के साथ, निर्भरता और बाद के दोनों का उपयोग करते हुए। यहां दो कार्यों को चलाने का एक उदाहरण है, एक (कस्टम पंजीकृत "importUnicodeFiles" कार्य) जो "इस" प्रोजेक्ट में है और एक (पूर्वनिर्धारित "रन" कार्य) जो ": यूनिकोड" नामक एक सिबलिंग प्रोजेक्ट में है:

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

ग्रैगल डेवलपर्स आम तौर पर इस दृष्टिकोण के खिलाफ सलाह देते हैं (वे कहते हैं कि आदेश देने के लिए मजबूर करना बुरा है, और यह कि अन्य परियोजनाओं से कार्यों को निष्पादित करना बुरा है), और परियोजनाओं के बीच परिणाम प्रकाशित करने के तरीके पर काम कर रहे हैं; देखें: https://docs.gradle.org/current/userguide/cross_project_publications.html


-1

यहाँ है कि मैंने इसे कैसे किया, कोटलिन स्क्रिप्टिंग के साथ, निर्भरता और बाद के दोनों का उपयोग करते हुए। यहां दो कार्यों को चलाने का एक उदाहरण है, एक (कस्टम पंजीकृत "importUnicodeFiles" कार्य) जो "इस" प्रोजेक्ट में है और एक (पूर्वनिर्धारित "रन" कार्य) जो ": यूनिकोड" नामक एक सिबलिंग प्रोजेक्ट में है:

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.