2012-04-25 35 views
110

Làm thế nào tôi có thể dừng xây dựng Gradle sau khi phát hiện sự cố? Tôi có thể sử dụng một khẳng định, ném một ngoại lệ, làm một 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 là gì (và tại sao?).Cách được đề xuất để dừng xây dựng Gradle

Trả lời

88

Tôi thường ném ngoại lệ có liên quan từ org.gradle.api package, ví dụ: InvalidUserDataException cho thời điểm ai đó đã nhập nội dung nào đó không hợp lệ hoặc GradleScriptException để có thêm lỗi chung.

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

+4

Bạn cũng có thể sử dụng [TaskExecutionException] (http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskExecutionException.html) nếu tác vụ không thực thi thành công. (Điều này đúng theo tài liệu 1.11 tài liệu, tôi không chắc chắn khi nào nó được giới thiệu.) –

+0

có bất kỳ tùy chọn cú pháp đẹp nào ở đây không? Hãy xem xét cú pháp điều kiện tiên quyết của kotlin: 'require (something! = Whatever) {" Không tốt! " } 'trái ngược với chi tiết hơn và loại-ee' nếu (cái gì! = bất kỳ) {ném new GradleException ("Không tốt!")} ' – Groostav

+0

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

21

Hiện nay chưa có phương pháp chuyên dụng, mặc dù có có các cuộc thảo luận được thêm một.

Cách được khuyến nghị để dừng xây dựng Gradle là ném một ngoại lệ. Vì Groovy không có ngoại lệ được kiểm tra, và Gradle theo mặc định không in kiểu ngoại lệ, nó không phải là ngoại lệ quan trọng được ném ra. Trong các kịch bản xây dựng, GradleException thường được sử dụng, nhưng xác nhận của 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 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ệ dành riêng StopExecutionException/StopActionException để dừng tác vụ/tác vụ hiện tại nhưng tiếp tục tạo.

53

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

throw new GradleException('error occurred') 

hoặc ném những lớp con cho ngoại lệ trên. Một số ngoại lệ phân lớp 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.

13

Một tùy chọn khác nếu bạn không có bất kỳ mong muốn nào để có thể bắt ngoại lệ sau này là gọi nhiệm vụ không thực hiện tác vụ chống lỗi. Đó là một chút dễ dàng hơn để đọc theo ý kiến ​​của tôi 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 thông báo như:

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

Có lẽ bạn thể bắt này (có lẽ nó ném BuildException kiến ​​không?) Nhưng nếu đó là một mục tiêu sau đó tôi sẽ không sử dụng kiến. Thất bại. Tôi chỉ làm cho nó dễ dàng để xem những gì ngoại lệ để bắt bằng cách ném ngoại lệ gradle tiêu chuẩn như tim_yates đề nghị.

+0

Tôi làm cách nào để thiết lập? Gọi nó đi? – powder366

+0

chỉ cần gọi ant.fail ('message of your choice') không cần thiết lập – Gus

+1

Dường như kết quả của ** ** giống hệt ** để sử dụng 'throw new GradleException (" Bầu trời rơi xuống !! ")' (Gradle 3.4.1) – mgaert

9

Ném 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 tốt cho việc kiểm tra thiết lập môi trường bắt buộc đối với .

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

Ví dụ:

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

Đây là một đoạn mã mà cố gắng để bắt chước cách javac nhiệm vụ Gradle 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 trở về lệnh 0 không có đầu ra. Bất kỳ giá trị nào khác sẽ in standardOutput và tạm dừng build.

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

Các vấn đề liên quan