Gradle yapısını durdurmanın önerilen yolu


162

Bir sorun algıladıktan sonra Gradle derlemesini nasıl durdurabilirim? Bir iddia kullanabilir, istisna atabilir, System.exit (kötü fikir) yapabilir veya Gradle'da özel bir işlev kullanabilirim (ancak bir tane bulamadım). Gradle için en iyi yol nedir (ve neden?).

Yanıtlar:


117

Genellikle org.gradle.apipaketin ilgili istisnasını atarım, örneğin InvalidUserDataExceptionbirisi geçersiz bir şey girdiğinde veya GradleScriptExceptiondaha genel hatalar için.

Geçerli görevi veya eylemi durdurmak ve bir sonrakine geçmek isterseniz, StopActionException


5
Bir görev başarıyla yürütülmezse TaskExecutionException özelliğini de kullanabilirsiniz . (Bu seviye 1.11 dokümana göre doğrudur, ne zaman tanıtıldığından emin değilim.)
Josh Gagnon

burada güzel sözdizimi seçenekleri var mı? Kotlin'in önkoşulları sözdizimini düşünün: require(something != whatever) { "No good!" }daha ayrıntılı ve tip- if(something != whatever){ throw new GradleException("No good!") }
ee'nin aksine

Korkunç şey GradleScriptException, bir sebep için ikinci bir parametre gerektirmesidir.
Trejkaz

... Elbette bunun " istisnalarla programlama " olduğunu söylemekten kaçınıyoruz ! Bu şekilde kodlanmış eski mirasım var ve sürdürülmesi dehşet verici ... Olde günlerde felsefe make, rules(görevlerin) başarılı veya başarısız olduğu. Bir keresinde denedim return false- Gradle sadece görmezden geldi ve koşmaya devam etti.
will

87

Eğer yapıyı durdurmak istiyorsanız, atın:

throw new GradleException('error occurred')

veya yukarıdaki istisna için alt sınıfları atın. Alt sınıf istisnalarından bazıları aslında sadece geçerli görevi başarısız kılar, ancak derlemeye devam eder.


28

Şu anda özel bir yöntem yoktur, ancak bir tane eklemek için tartışmalar olmuştur.

Bir Gradle derlemesini durdurmanın önerilen yolu bir istisna atmaktır. Groovy istisnaları kontrol etmediğinden ve Gradle varsayılan olarak istisna türünü yazdırmadığından, hangi istisnanın atıldığı kritik değildir. Derleme komut dosyalarında GradleException sıklıkla kullanılır, ancak Groovy iddiası da makul görünmektedir (koşullara ve kitleye bağlı olarak). Önemli olan açık bir mesaj vermektir. Bir neden (varsa) eklemek hata ayıklamaya ( --stacktrace) yardımcı olur .

Gradle adanmış istisna türü sağlar StopExecutionException/ StopActionExceptioncari görev / görev eylemi durdurma ama yapı devam etmesi için.


19

Daha sonra istisnayı yakalamak için herhangi bir isteğiniz yoksa başka bir seçenek, karınca başarısızlık görevini çağırmaktır. Bence okumak biraz daha kolay ve --statratrace kullanmadan kullanıcıya güzel bir mesaj verebilirsiniz.

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

Size şöyle bir mesaj verir:

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

Muhtemelen yapabilirsiniz (belki de karıncanın BuildException atar?) Bu yakalamak ama bu bir amaç buysa o zaman ant.fail kullanmazdım. Ben sadece tim_yates önerdiği gibi standart sınıf istisna atarak yakalamak ne istisnayı görmek kolaylaştırır.


Nasıl kurarım? Bunu aramak?
powder366

1
kurulum gerektirmez ant.fail ('seçtiğiniz mesaj') 'i arayın
Gus

2
Bu çıktısıdır benziyor özdeş kullanarak throw new GradleException("The sky is falling!!")(Gradle 3.4.1)
mgaert

@ 4 yıl önce bunu yazdığımda, yazdırılan mesajın farklı olduğunu hatırlıyorum. Atılan istisna bir şey olarak okur oysa Bunun ötesinde, IMHO ant.fail daha net, tam yapı durdurmaya niyeti iletişim kurar olabilir yakalanarak ele alınması.
Gus

12

Basit bir GradleException özelliğinin oluşturulması, komut dosyasının durdurulmasında işe yarar. Bu, gerekli ortam kurulumunu kontrol etmek için harika çalışır.

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

Misal:

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

6

Gradle javac görevinin hataları nasıl attığını taklit etmeye çalışan bir kod parçası:

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

Komut geri döndüğünde 0çıktı alınmaz. Başka bir değer standardOutput öğesini yazdırır ve derlemeyi durdurur.

NOT: Komutunuz errorOutput'a da yazarsa, bunu hata günlüğüne eklemeniz gerekebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.