Cách được đề xuất để dừng xây dựng Gradle


162

Làm cách nào tôi có thể dừng bản dựng Gradle sau khi phát hiện sự cố? Tôi có thể sử dụng một xác nhận, đưa ra một ngoại lệ, thực hiện System.exit (ý tưởng tồi) hoặc sử dụng một chức năng chuyên dụng trong Gradle (nhưng tôi không thể tìm thấy một). Cách tốt nhất cho Gradle (và tại sao?).

Câu trả lời:


117

Tôi thường ném ngoại lệ có liên quan từ org.gradle.apigói , ví dụ như InvalidUserDataExceptionkhi ai đó đã nhập một cái gì đó không hợp lệ hoặc GradleScriptExceptioncho các lỗi chung hơn.

Nếu bạn muốn dừng nhiệm vụ hoặc hành động hiện tại và chuyển sang tiếp theo, bạn cũng có thể ném StopActionException


5
Bạn cũng có thể sử dụng TaskExecutException nếu một tác vụ không thực thi thành công. (Điều này đúng theo tài liệu lớp 1.11, tôi không chắc chắn khi nào nó được giới thiệu.)
Josh Gagnon

Có bất kỳ tùy chọn cú pháp tốt đẹp ở đây? Hãy xem xét cú pháp điều kiện tiên quyết của kotlin: require(something != whatever) { "No good!" }trái ngược với kiểu dài dòng và kiểu ee hơnif(something != whatever){ throw new GradleException("No good!") }
Groostav

Điều khủng khiếp GradleScriptExceptionlà nó đòi hỏi một tham số thứ hai cho một nguyên nhân.
Trejkaz

... Tất nhiên chúng tôi đang tránh nói rằng đây là " lập trình bằng ngoại lệ "?! Tôi có di sản được viết theo cách đó và thật là kinh dị khi duy trì ... Vào thời xa xưa , triết lý xung quanh makerules(nhiệm vụ) đã thành công hay thất bại. Tôi đã từng thử return false- Gradle chỉ bỏ qua nó và tiếp tục chạy.
sẽ

87

Nếu bạn muốn dừng việc xây dựng, hãy ném:

throw new GradleException('error occurred')

hoặc ném các lớp con cho ngoại lệ trên. Một số trường hợp ngoại lệ lớp con thực sự chỉ thất bại nhiệm vụ hiện tại nhưng tiếp tục với việc xây dựng.


28

Hiện tại không có phương pháp dành riêng, mặc dù đã có các cuộc thảo luận để thêm một phương pháp.

Cách được đề xuất để ngăn chặn bản dựng Gradle là ném ngoại lệ. Vì Groovy không kiểm tra ngoại lệ và Gradle theo mặc định không in loại ngoại lệ, nên việc ném ngoại lệ nào không quan trọng. Trong các tập lệnh xây dựng, GradleException thường được sử dụng, nhưng một xác nhận Groovy cũng có vẻ hợp lý (tùy thuộc vào hoàn cảnh và đối tượng). Điều quan trọng là cung cấp một thông điệp rõ ràng. Thêm một nguyên nhân (nếu có) sẽ giúp gỡ lỗi ( --stacktrace).

Gradle cung cấp các loại ngoại lệ chuyên dụng StopExecutionException/ StopActionExceptionđể dừng tác vụ / tác vụ hiện tại nhưng vẫn tiếp tục quá trình xây dựng.


19

Một lựa chọn khác nếu bạn không có mong muốn có thể bắt ngoại lệ sau này là gọi nhiệm vụ thất bại. Theo ý kiến ​​của tôi, nó dễ đọc hơn một chút và bạn có thể đưa ra một thông điệp tốt đẹp cho người dùng mà không cần sử dụng --stacktrace.

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

Cung cấp cho bạn một tin nhắn như:

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

Có lẽ bạn có thể bắt được điều này (có lẽ nó ném BuildException của kiến?) Nhưng nếu đó là mục tiêu thì tôi sẽ không sử dụng ant.fail. Tôi chỉ làm cho nó dễ dàng để xem ngoại lệ nào cần nắm bắt bằng cách ném ngoại lệ lớp tiêu chuẩn như tim_yates đề xuất.


Làm thế nào để tôi thiết lập nó? Gọi nó đi?
bột366

1
chỉ cần gọi ant.fail ('tin nhắn bạn chọn') không cần thiết lập
Gus

2
Có vẻ như đầu ra của cái này giống hệt với việc sử dụng throw new GradleException("The sky is falling!!")(Lớp 3.4.1)
mgaert

@mgaert Tôi dường như nhớ lại rằng 4 năm trước khi tôi viết bài này, tin nhắn được in khác nhau (nhưng đó là một thời gian dài và tôi không cảm thấy như tìm ra phiên bản nào hiện tại và kiểm tra). Ngoài ra, IMHO ant.fail truyền đạt rõ ràng hơn ý định dừng hoàn toàn việc xây dựng, trong khi ngoại lệ bị ném đọc là thứ thể bị bắt và xử lý.
Gus

12

Ném một GradleException đơn giản hoạt động trong việc dừng tập lệnh xây dựng. Điều này hoạt động tuyệt vời để kiểm tra thiết lập môi trường cần thiết.

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

Thí dụ:

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

5

Đây là một đoạn mã cố gắng mô phỏng cách tác vụ Gradac javac ném lỗi:

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

Khi lệnh trả về 0không có đầu ra. Bất kỳ giá trị nào khác sẽ in ra StandardOutput và tạm dừng quá trình xây dựng.

LƯU Ý: Nếu lệnh của bạn cũng ghi vào errorOutput, bạn có thể cần đưa nó vào nhật ký lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.