Gradle 빌드를 중지하는 권장 방법


162

문제를 감지 한 후 Gradle 빌드를 중지하려면 어떻게해야합니까? assert를 사용하거나 예외를 발생 시키거나 System.exit (나쁜 생각)를 수행하거나 Gradle에서 전용 함수를 사용할 수 있습니다 (그러나 찾을 수는 없습니다). Gradle에 가장 좋은 방법은 무엇입니까?

답변:


117

나는 보통에서 관련 예외를 발생 org.gradle.api패키지 예를 들어, InvalidUserDataException누군가가 입력 한 뭔가 잘못에 대한, 또는 GradleScriptException일반적인 오류.

현재 작업 또는 작업을 중지하고 다음 작업으로 넘어가려면 StopActionException


5
작업이 성공적으로 실행되지 않으면 TaskExecutionException 을 사용할 수도 있습니다 . (이것은 내가 확신이 도입되었을 때 아니에요의 Gradle을 1.11 문서에 따라 해당됩니다.)
조쉬 Gagnon의

여기 좋은 구문 옵션이 있습니까? kotlin의 전제 조건 구문을 고려하십시오 require(something != whatever) { "No good!" }. 더 장황하고 type-ee가 if(something != whatever){ throw new GradleException("No good!") }
아닌

끔찍한 것은 GradleScriptException원인에 대한 두 번째 매개 변수가 필요하다는 것입니다.
Trejkaz

물론 이것은 " 예외에 의한 프로그래밍 "이라고 말하는 것을 피하고 있습니다 ! 나는 기존 그런 식으로 작성 코딩 된하고 그것을 유지하는 공포입니다 ...에서 올드 일 철학은 약 makerules성공 또는 실패 (태스크들). 나는 한 번 시도했다 return false-Gradle은 그것을 무시하고 계속 실행했다.
것이다

87

빌드를 중지하려면 다음을 수행하십시오.

throw new GradleException('error occurred')

위의 예외에 대한 서브 클래스를 던지십시오. 일부 서브 클래스 예외는 실제로 현재 작업 만 실패하지만 빌드를 계속합니다.


28

추가 할 토론이 있었지만 현재는 전용 방법이 없습니다.

Gradle 빌드를 중지하는 권장 방법은 예외를 발생시키는 것입니다. Groovy는 예외를 검사하지 않았고 Gradle은 기본적으로 예외 유형을 인쇄하지 않으므로 어떤 예외가 throw되는지는 중요하지 않습니다. 빌드 스크립트에서는 GradleException이 자주 사용되지만 상황과 대상에 따라 Groovy 어설 션도 합리적으로 보입니다. 중요한 것은 명확한 메시지를 제공하는 것입니다. 원인을 추가하면 (사용 가능한 경우) 디버깅에 도움이됩니다 ( --stacktrace).

Gradle을 전용 예외 유형을 제공합니다 StopExecutionException/ StopActionException현재 작업 / 작업 동작을 중지하지만, 빌드를 계속하십시오.


19

나중에 예외를 포착하지 않으려는 경우 또 다른 옵션은 개미 실패 작업을 호출하는 것입니다. 내 의견으로는 약간 더 읽기 쉽고 --stacktrace를 사용하지 않고도 사용자에게 좋은 메시지를 줄 수 있습니다.

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

다음과 같은 메시지를 제공합니다.

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

아마 당신 이것을 잡을 수 있습니다 (아마도 Ant의 BuildException을 던지나요?)하지만 그것이 목표라면 ant.fail을 사용하지 않을 것입니다. tim_yates가 제안한대로 표준 gradle 예외를 던져서 포착 할 예외를 쉽게 볼 수있게 만들었습니다.


어떻게 설정합니까? 불러라?
powder366

1
그냥 ant.fail ( '선택의 메시지')를 호출하십시오 설정이 필요하지 않습니다
Gus

2
또한 이것의 출력은 보이는 동일한 사용하여 throw new GradleException("The sky is falling!!")(Gradle을 3.4.1)
mgaert가

@ mgaert 나는 4 년 전에 이것을 썼을 때 인쇄 된 메시지가 다르다는 것을 상기하는 것처럼 보인다. 그 외에도 IMHO ant.fail은 빌드를 완전히 중지하려는 의도를보다 명확하게 전달하는 반면 throw 된 예외 는 포착 및 처리 될 있는 것으로 읽습니다 .
거스

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

5

다음은 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출력이 없습니다. 다른 값은 standardOutput을 인쇄하고 빌드를 중단합니다.

참고 : 명령이 errorOutput에도 쓰면 오류 로그에 포함시켜야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.