2012-04-25 8 views
110

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

उत्तर

88

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

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

+4

यदि कोई कार्य सफलतापूर्वक निष्पादित नहीं होता है तो आप [TaskExecutionException] (http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskExecutionException.html) का भी उपयोग कर सकते हैं। (यह 1.11 दस्तावेज़ों के क्रमिक के अनुसार सच है, मुझे यकीन नहीं है कि इसे कब पेश किया गया था।) –

+0

क्या कोई अच्छा वाक्यविन्यास विकल्प यहां हैं? कोटलिन की पूर्व शर्त वाक्यविन्यास पर विचार करें: 'आवश्यकता है (कुछ! = जो कुछ भी) {"अच्छा नहीं!" } 'के रूप में अधिक वर्बोज़ और टाइप-ई' के विपरीत 'अगर (कुछ! = जो कुछ भी) {नया ग्रैडलएक्सप्शन फेंक दें ("अच्छा नहीं!")} – Groostav

+0

'GradleScriptException' के बारे में भयानक बात यह है कि इसे एक दूसरे पैरामीटर की आवश्यकता है कारण। – Trejkaz

21

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

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

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

53

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

throw new GradleException('error occurred') 

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

13

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

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

आप की तरह एक संदेश देता है:

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

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

+0

मैं इसे कैसे सेट अप करूं? इसे कहते हैं? – powder366

+0

बस एंटी.फेल ('अपनी पसंद का संदेश') को कोई सेटअप आवश्यक नहीं है – Gus

+1

ऐसा लगता है कि इसका उत्पादन ** समान ** है 'थ्रो न्यू ग्रैडएक्सप्शन ("आकाश गिर रहा है !!') का उपयोग करने के लिए ** (ग्रैडल 3.4.1) – mgaert

9

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

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

उदाहरण: आदेश रिटर्न 0 कोई उत्पादन होता है जब

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.") 
      ) 
     } 
    } 
} 

:

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

यहाँ एक कोड टुकड़ा अनुकरण करने के लिए कैसे Gradle javac काम त्रुटियों फेंकता कोशिश करता है। कोई अन्य मूल्य मानक आउटपुट प्रिंट करेगा और बिल्ड को रोक देगा।

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

संबंधित मुद्दे