Cara yang disarankan untuk menghentikan pembangunan Gradle

162

Bagaimana saya bisa menghentikan pembangunan Gradle setelah mendeteksi masalah? Saya dapat menggunakan pernyataan, melemparkan pengecualian, melakukan System.exit (ide buruk), atau menggunakan fungsi khusus di Gradle (tapi saya tidak dapat menemukannya). Apa cara terbaik untuk Gradle (dan mengapa?).

Kartoch
sumber

Jawaban:

117

Saya biasanya membuang pengecualian yang relevan dari org.gradle.apipaket , misalnya InvalidUserDataExceptionketika seseorang memasukkan sesuatu yang tidak valid, atau GradleScriptExceptionuntuk kesalahan yang lebih umum.

Jika Anda ingin menghentikan tugas atau tindakan saat ini, dan beralih ke yang berikutnya, Anda juga dapat melempar a StopActionException

tim_yates
sumber
5
Anda juga dapat menggunakan TaskExecutionException jika tugas tidak berhasil dijalankan. (Ini benar menurut grad 1.11 docs, saya tidak yakin kapan diperkenalkan.)
Josh Gagnon
apakah ada opsi sintaks yang bagus di sini? Pertimbangkan sintaks prasyarat kotlin: require(something != whatever) { "No good!" }sebagai lawan dari lebih verbose dan type-eeif(something != whatever){ throw new GradleException("No good!") }
Groostav
Hal yang mengerikan tentang GradleScriptExceptionini adalah bahwa ia membutuhkan parameter kedua untuk suatu penyebab.
Trejkaz
... Tentu saja kita menghindari mengatakan bahwa ini adalah " pemrograman dengan pengecualian " ?! Saya memiliki kode warisan yang ditulis dengan cara itu dan itu mengerikan untuk dipertahankan ... Di masa lalu filosofi di sekitar makeadalah bahwa rules(tugas-s) berhasil atau gagal. Saya pernah mencoba return false- Gradle mengabaikannya dan terus berlari.
akan
87

Jika Anda ingin menghentikan pembangunan, lemparkan:

throw new GradleException('error occurred')

atau melempar subclass untuk pengecualian di atas. Beberapa pengecualian subkelas sebenarnya hanya gagal tugas saat ini tetapi terus dengan membangun.

gempal
sumber
28

Saat ini tidak ada metode khusus, meskipun ada diskusi untuk menambahkannya.

Cara yang disarankan untuk menghentikan pembangunan Gradle adalah dengan melemparkan pengecualian. Karena Groovy tidak memeriksa pengecualian, dan Gradle secara default tidak mencetak tipe pengecualian, itu tidak terlalu penting untuk pengecualian yang dilemparkan. Dalam membangun skrip, GradleException sering digunakan, tetapi pernyataan Groovy juga tampaknya masuk akal (tergantung pada keadaan dan audiens). Yang penting adalah memberikan pesan yang jelas. Menambahkan penyebab (jika tersedia) membantu untuk debugging ( --stacktrace).

Gradle menyediakan tipe pengecualian khusus StopExecutionException/ StopActionExceptionuntuk menghentikan tugas / tindakan tugas saat ini tetapi melanjutkan pembangunan.

Peter Niederwieser
sumber
19

Pilihan lain jika Anda tidak memiliki keinginan untuk dapat menangkap pengecualian di kemudian hari adalah memanggil tugas semut gagal. Ini sedikit lebih mudah dibaca menurut saya dan Anda dapat memberikan pesan yang bagus kepada pengguna tanpa menggunakan --stacktrace.

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

Memberi Anda pesan seperti:

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

Mungkin Anda dapat menangkap ini (mungkin itu melempar BuildException semut?) Tetapi jika itu tujuan maka saya tidak akan menggunakan ant.fail. Saya hanya akan membuatnya mudah untuk melihat pengecualian apa yang ditangkap dengan melemparkan pengecualian standar gradle seperti yang disarankan tim_yates.

Gus
sumber
Bagaimana cara mengaturnya? Sebut saja?
powder366
1
panggil saja ant.fail ('pesan pilihan Anda') tidak perlu pengaturan
Gus
2
Sepertinya keluaran dari ini identik dengan menggunakan throw new GradleException("The sky is falling!!")(Gradle 3.4.1)
mgaert
@mgaert Sepertinya saya ingat bahwa 4 tahun yang lalu ketika saya menulis ini, pesan yang dicetak memang berbeda (tapi itu waktu yang lama dan saya tidak ingin mencari tahu versi apa yang sedang berjalan saat itu dan memeriksa). Di luar itu, IMHO ant.fail lebih jelas mengomunikasikan niat untuk sepenuhnya menghentikan pembangunan, sedangkan pengecualian yang dilempar berbunyi sebagai sesuatu yang mungkin ditangkap dan ditangani.
Gus
12

Melemparkan GradleException sederhana berfungsi dalam menghentikan skrip build. Ini berfungsi baik untuk memeriksa pengaturan lingkungan yang diperlukan.

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

Contoh:

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

Berikut adalah fragmen kode yang mencoba meniru bagaimana tugas javac Gradle melempar kesalahan:

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

Ketika perintah kembali 0tidak ada output. Nilai lain akan mencetak standardOutput dan menghentikan build.

CATATAN: Jika perintah Anda juga menulis ke errorOutput, Anda mungkin perlu memasukkannya ke dalam log kesalahan.

cmcginty
sumber