एक ग्रेड निर्माण को रोकने के लिए अनुशंसित तरीका


162

किसी समस्या का पता लगाने के बाद मैं ग्रैडल निर्माण कैसे रोक सकता हूं? मैं एक एस्टर का उपयोग कर सकता हूं, एक अपवाद फेंक सकता हूं, एक System.exit (बुरा विचार) कर सकता हूं, या ग्रैडल में एक समर्पित फ़ंक्शन का उपयोग कर सकता हूं (लेकिन मुझे एक नहीं मिला)। ग्रैडल के लिए सबसे अच्छा तरीका क्या है (और क्यों?)।

जवाबों:


117

मैं आमतौर पर org.gradle.apiपैकेज से प्रासंगिक अपवाद को फेंक देता हूं , उदाहरण के InvalidUserDataExceptionलिए जब कोई व्यक्ति कुछ अमान्य दर्ज किया गया है, या GradleScriptExceptionअधिक सामान्य त्रुटियों के लिए।

यदि आप वर्तमान कार्य या क्रिया को रोकना चाहते हैं, और अगले पर जाना चाहते हैं, तो आप भी फेंक सकते हैं StopActionException


5
यदि टास्क सफलतापूर्वक निष्पादित नहीं होता है, तो आप TaskExecutionException का उपयोग भी कर सकते हैं । (यह 1.11 डॉक्स के अनुसार सही है, मुझे यकीन नहीं है कि इसे कब पेश किया गया था।)
जोश गगनोन

यहाँ कोई अच्छा वाक्यविन्यास विकल्प हैं? कोटलिन की पूर्व शर्त सिंटैक्स पर विचार करें: require(something != whatever) { "No good!" }अधिक if(something != whatever){ throw new GradleException("No good!") }
क्रिया

इसके बारे GradleScriptExceptionमें भयानक बात यह है कि इसके लिए दूसरे पैरामीटर की आवश्यकता होती है।
ट्रेकजाज़

... बेशक हम यह कहने से बच रहे हैं कि यह " अपवादों द्वारा प्रोग्रामिंग " है! मेरे पास उस तरह से लिखित विरासत की कोडिंग है और इसे बनाए रखना एक डरावनी बात है ... पुराने दिनों में चारों ओर दर्शन makeयह है कि rules(कार्य-एस) सफल या असफल रहा। मैंने एक बार कोशिश की return false- ग्रैडल ने इसे अनदेखा कर दिया और दौड़ना जारी रखा।
होगा

87

यदि आप निर्माण रोकना चाहते हैं, तो फेंकें:

throw new GradleException('error occurred')

या उप अपवादों के लिए उपवर्गों को फेंक दें। कुछ उपवर्ग अपवाद वास्तव में केवल वर्तमान कार्य को विफल करते हैं लेकिन निर्माण के साथ जारी रहते हैं।


28

वर्तमान में कोई समर्पित तरीका नहीं है, हालांकि इसमें एक जोड़ने की चर्चा हुई है।

ग्रैडल बिल्ड को रोकने के लिए अनुशंसित तरीका अपवाद को फेंकना है। चूंकि ग्रूवी ने अपवादों की जांच नहीं की है, और डिफ़ॉल्ट रूप से ग्रैड अपवाद प्रकार को प्रिंट नहीं करता है, इसलिए यह महत्वपूर्ण नहीं है कि कौन सा अपवाद फेंक दिया गया है। स्क्रिप्ट का निर्माण करने में, ग्रेडलेएक्स अपवाद अक्सर उपयोग किया जाता है, लेकिन एक ग्रूवी जोर भी उचित लगता है (परिस्थितियों और दर्शकों के आधार पर)। एक स्पष्ट संदेश प्रदान करना महत्वपूर्ण है। कारण जोड़ने (यदि उपलब्ध हो) डिबगिंग ( --stacktrace) के लिए मदद करता है ।

स्नातक वर्तमान कार्य / कार्य कार्रवाई को रोकने के लिए / लेकिन निर्माण जारी रखने के लिए समर्पित अपवाद प्रकार StopExecutionException/ प्रदान करता है StopActionException


19

एक अन्य विकल्प यदि आपके पास कोई अपवाद नहीं है, तो बाद में अपवाद को पकड़ने में सक्षम होने के लिए चींटी असफल कार्य को कॉल करना है। यह मेरी राय में पढ़ने के लिए थोड़ा आसान है और आप --stacktrace के उपयोग के बिना उपयोगकर्ता को एक अच्छा संदेश दे सकते हैं।

task (tarball, dependsOn: warAdmin) << {
    ant.fail('The sky is falling!!')
}

आपको एक संदेश देता है जैसे:

* What went wrong:
Execution failed for task ':tarball'.
> The sky is falling!!

संभवतः आप इसे पकड़ सकते हैं (शायद यह चींटी की BuildException को फेंकता है?) लेकिन अगर यह एक लक्ष्य है तो मैं ant.fail का उपयोग नहीं करूंगा। मैं सिर्फ यह देखना आसान बनाता हूं कि मानक ग्रेड अपवाद को फेंकने से क्या अपवाद दिखाई देता है जैसा कि tim_yates ने सुझाव दिया है।


मैं इसे किस तरह से सेट अप करूं? इसे कहते हैं?
पाउडर 366

1
बस कॉल ant.fail ('अपनी पसंद का संदेश') कोई सेटअप की आवश्यकता है
Gus

2
ऐसा लगता है कि इस का उत्पादन प्रयोग के समान है throw new GradleException("The sky is falling!!")(
ग्रैडल

@ मैगर्ट मुझे याद है कि 4 साल पहले जब मैंने यह लिखा था, तब छपे संदेश में भिन्नता थी (लेकिन यह एक लंबा समय है और मुझे ऐसा नहीं लगता कि उस समय और जाँच में कौन सा संस्करण मौजूद था)। इसके अलावा, IMHO एंटी.फ़ेल अधिक स्पष्ट रूप से बिल्ड को पूरी तरह से रोकने के इरादे का संचार करता है, जबकि फेंका गया अपवाद कुछ ऐसा पढ़ता है जिसे पकड़ा और संभाला जा सकता है।
गस

12

एक सरल GradleException को फेंकना बिल्ड स्क्रिप्ट को रोकने में काम करता है। यह आवश्यक पर्यावरण सेटअप की जाँच के लिए महान काम करता है।

GradleException('your message, why the script is stopped.')

उदाहरण:

if(null == System.getenv()['GRADLE_USER_HOME']) {
    throw new GradleException('Required GRADLE_USER_HOME environment variable not set.')
}

5

यहाँ एक कोड टुकड़ा है जो यह बताने की कोशिश करता है कि ग्रेडल जेवैक कार्य कैसे त्रुटि फेंकता है:

task myCommand(type:Exec) {

    ... normal task setup ....

    ignoreExitValue true
    standardOutput = new ByteArrayOutputStream()
    ext.output = { standardOutput.toString() }
    doLast {
        if (execResult.exitValue) {
            logger.error(output())
            throw new TaskExecutionException( it,
                new Exception( "Command '${commandLine.join(' ')}' failed; "
                              + "see task output for details." )
            )
        }
    }
}

जब कमांड वापस 0आती है तो कोई आउटपुट नहीं होता है। कोई भी अन्य मान StandardOutput को प्रिंट करेगा और बिल्ड को रोक देगा।

नोट: यदि आपकी कमांड एरर ऑउटपुट को भी लिखती है, तो आपको एरर लॉग में शामिल करने की आवश्यकता हो सकती है।

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