วิธีที่แนะนำในการหยุดการสร้าง Gradle


162

ฉันจะหยุดการสร้าง Gradle หลังจากตรวจพบปัญหาได้อย่างไร ฉันสามารถใช้ assert, โยนข้อยกเว้นทำ System.exit (ความคิดที่ไม่ดี) หรือใช้ฟังก์ชั่นเฉพาะใน Gradle (แต่ฉันไม่สามารถหาได้) อะไรคือวิธีที่ดีที่สุดสำหรับ Gradle (และทำไม?)

คำตอบ:


117

ฉันมักจะโยนข้อยกเว้นที่เกี่ยวข้องจากorg.gradle.apiแพคเกจเช่นInvalidUserDataExceptionเมื่อมีคนป้อนสิ่งที่ไม่ถูกต้องหรือGradleScriptExceptionข้อผิดพลาดทั่วไปเพิ่มเติม

หากคุณต้องการหยุดงานหรือการกระทำปัจจุบันและไปที่สิ่งต่อไปคุณสามารถขว้าง StopActionException


5
คุณยังสามารถใช้TaskExecutionExceptionหากงานไม่สามารถดำเนินการได้สำเร็จ (เรื่องนี้เป็นจริงตามระดับ 1.11 docs ฉันไม่แน่ใจว่าจะเปิดตัวเมื่อไหร่)
Josh Gagnon

มีตัวเลือกไวยากรณ์ที่ดีที่นี่หรือไม่ พิจารณาไวยากรณ์พื้นฐานของ kotlin: require(something != whatever) { "No good!" }ตรงข้ามกับ verbose และ type-ee มากขึ้นif(something != whatever){ throw new GradleException("No good!") }
Groostav

สิ่งที่น่ากลัวก็GradleScriptExceptionคือมันต้องมีพารามิเตอร์ที่สองสำหรับสาเหตุ
Trejkaz

... แน่นอนเรากำลังหลีกเลี่ยงการพูดว่านี่คือ " การเขียนโปรแกรมโดยมีข้อยกเว้น "?! ฉันเขียนรหัสมรดกไว้อย่างนั้นและมันก็เป็นเรื่องสยองขวัญที่จะรักษา ... ในสมัยก่อนปรัชญารอบ ๆmakeคือrules(ภารกิจ) ประสบความสำเร็จหรือล้มเหลว ฉันเคยลองแล้วreturn false- Gradle เพิ่งเพิกเฉยและยังคงวิ่งต่อไป
จะ

87

หากคุณต้องการหยุดการสร้างให้โยน:

throw new GradleException('error occurred')

หรือโยนคลาสย่อยสำหรับข้อยกเว้นข้างต้น ข้อยกเว้นคลาสย่อยบางอย่างล้มเหลวในงานปัจจุบันเท่านั้น แต่ดำเนินการต่อด้วยบิลด์


28

ไม่มีวิธีการเฉพาะในขณะนี้แม้ว่าจะมีการหารือเพื่อเพิ่มวิธีการหนึ่ง

วิธีที่แนะนำเพื่อหยุดการสร้าง Gradle คือการโยนข้อยกเว้น เนื่องจาก Groovy ไม่ได้ตรวจสอบข้อยกเว้นและ Gradle ตามค่าเริ่มต้นจะไม่พิมพ์ประเภทข้อยกเว้นจึงไม่สำคัญว่าข้อยกเว้นใดจะถูกโยนทิ้ง ในสคริปต์การสร้าง GradleException มักใช้ แต่การยืนยัน Groovy ก็ดูเหมือนสมเหตุสมผล (ขึ้นอยู่กับสถานการณ์และผู้ชม) สิ่งสำคัญคือการให้ข้อความที่ชัดเจน การเพิ่มสาเหตุ (หากมี) ช่วยในการดีบัก ( --stacktrace)

Gradle มีประเภทข้อยกเว้นเฉพาะStopExecutionException/ StopActionExceptionสำหรับการหยุดภารกิจ / การกระทำในปัจจุบัน แต่ยังคงสร้างต่อไป


19

ตัวเลือกอื่นหากคุณไม่มีความปรารถนาใด ๆ ที่จะสามารถตรวจสอบข้อยกเว้นในภายหลังได้คือเรียกภารกิจ 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 แนะนำ


ฉันจะตั้งค่าได้อย่างไร เรียกมันว่า?
powder366

1
เพียงโทร ant.fail ('ข้อความที่คุณเลือก') ไม่จำเป็นต้องติดตั้ง
Gus

2
ดูเหมือนว่าการส่งออกของนี้เป็นเหมือนกันกับการใช้throw new GradleException("The sky is falling!!")(Gradle 3.4.1)
mgaert

@ mgaert ฉันดูเหมือนจะจำได้ว่าเมื่อ 4 ปีก่อนเมื่อฉันเขียนสิ่งนี้ข้อความที่พิมพ์นั้นแตกต่างกันไป (แต่นั่นเป็นเวลานานและฉันไม่รู้สึกอยากรู้ว่าเวอร์ชันปัจจุบันเป็นอย่างไรในเวลานั้นและตรวจสอบ) ยิ่งไปกว่านั้น IMHO ant.fail สื่อสารอย่างชัดเจนยิ่งขึ้นถึงความตั้งใจที่จะหยุดการสร้างอย่างสมบูรณ์ในขณะที่ข้อยกเว้นที่ส่งออกมาจะอ่านเป็นสิ่งที่อาจถูกจับได้และจัดการ
Gus

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

6

นี่คือส่วนของโค้ดที่พยายามเลียนแบบวิธีการ 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 เช่นกันคุณอาจต้องรวมไว้ในบันทึกข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.