ฉันจะหยุดการสร้าง Gradle หลังจากตรวจพบปัญหาได้อย่างไร ฉันสามารถใช้ assert, โยนข้อยกเว้นทำ System.exit (ความคิดที่ไม่ดี) หรือใช้ฟังก์ชั่นเฉพาะใน Gradle (แต่ฉันไม่สามารถหาได้) อะไรคือวิธีที่ดีที่สุดสำหรับ Gradle (และทำไม?)
ฉันจะหยุดการสร้าง Gradle หลังจากตรวจพบปัญหาได้อย่างไร ฉันสามารถใช้ assert, โยนข้อยกเว้นทำ System.exit (ความคิดที่ไม่ดี) หรือใช้ฟังก์ชั่นเฉพาะใน Gradle (แต่ฉันไม่สามารถหาได้) อะไรคือวิธีที่ดีที่สุดสำหรับ Gradle (และทำไม?)
คำตอบ:
ฉันมักจะโยนข้อยกเว้นที่เกี่ยวข้องจากorg.gradle.api
แพคเกจเช่นInvalidUserDataException
เมื่อมีคนป้อนสิ่งที่ไม่ถูกต้องหรือGradleScriptException
ข้อผิดพลาดทั่วไปเพิ่มเติม
หากคุณต้องการหยุดงานหรือการกระทำปัจจุบันและไปที่สิ่งต่อไปคุณสามารถขว้าง StopActionException
require(something != whatever) { "No good!" }
ตรงข้ามกับ verbose และ type-ee มากขึ้นif(something != whatever){ throw new GradleException("No good!") }
GradleScriptException
คือมันต้องมีพารามิเตอร์ที่สองสำหรับสาเหตุ
make
คือrules
(ภารกิจ) ประสบความสำเร็จหรือล้มเหลว ฉันเคยลองแล้วreturn false
- Gradle เพิ่งเพิกเฉยและยังคงวิ่งต่อไป
หากคุณต้องการหยุดการสร้างให้โยน:
throw new GradleException('error occurred')
หรือโยนคลาสย่อยสำหรับข้อยกเว้นข้างต้น ข้อยกเว้นคลาสย่อยบางอย่างล้มเหลวในงานปัจจุบันเท่านั้น แต่ดำเนินการต่อด้วยบิลด์
ไม่มีวิธีการเฉพาะในขณะนี้แม้ว่าจะมีการหารือเพื่อเพิ่มวิธีการหนึ่ง
วิธีที่แนะนำเพื่อหยุดการสร้าง Gradle คือการโยนข้อยกเว้น เนื่องจาก Groovy ไม่ได้ตรวจสอบข้อยกเว้นและ Gradle ตามค่าเริ่มต้นจะไม่พิมพ์ประเภทข้อยกเว้นจึงไม่สำคัญว่าข้อยกเว้นใดจะถูกโยนทิ้ง ในสคริปต์การสร้าง GradleException มักใช้ แต่การยืนยัน Groovy ก็ดูเหมือนสมเหตุสมผล (ขึ้นอยู่กับสถานการณ์และผู้ชม) สิ่งสำคัญคือการให้ข้อความที่ชัดเจน การเพิ่มสาเหตุ (หากมี) ช่วยในการดีบัก ( --stacktrace
)
Gradle มีประเภทข้อยกเว้นเฉพาะStopExecutionException
/ StopActionException
สำหรับการหยุดภารกิจ / การกระทำในปัจจุบัน แต่ยังคงสร้างต่อไป
ตัวเลือกอื่นหากคุณไม่มีความปรารถนาใด ๆ ที่จะสามารถตรวจสอบข้อยกเว้นในภายหลังได้คือเรียกภารกิจ ant fail มันง่ายกว่าที่จะอ่านในความคิดของฉันและคุณสามารถส่งข้อความที่ดีให้กับผู้ใช้โดยไม่ต้องใช้ --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 แนะนำ
throw new GradleException("The sky is falling!!")
(Gradle 3.4.1)
การใช้ 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.')
}
นี่คือส่วนของโค้ดที่พยายามเลียนแบบวิธีการ Gradle javac พ่นข้อผิดพลาด:
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
จะไม่มีเอาต์พุต ค่าอื่นใดจะพิมพ์เอาท์พุทมาตรฐานและหยุดบิลด์
หมายเหตุ: หากคำสั่งของคุณเขียนไปยัง errorOutput เช่นกันคุณอาจต้องรวมไว้ในบันทึกข้อผิดพลาด