【问题标题】:Recommended way to stop a Gradle build停止 Gradle 构建的推荐方法
【发布时间】:2012-05-05 22:28:49
【问题描述】:

检测到问题后如何停止 Gradle 构建?我可以使用断言、抛出异常、执行 System.exit(坏主意)或在 Gradle 中使用专用函数(但我找不到)。 Gradle 的最佳方式是什么(为什么?)。

【问题讨论】:

    标签: groovy build gradle


    【解决方案1】:

    我通常从org.gradle.api package 抛出相关异常,例如InvalidUserDataException 表示有人输入了无效的内容,或者GradleScriptException 表示更一般的错误。

    如果你想停止当前的任务或动作,继续下一个,你也可以抛出StopActionException

    【讨论】:

    • 如果任务执行不成功,也可以使用TaskExecutionException。 (根据 gradle 1.11 文档,这是真的,我不确定它是什么时候引入的。)
    • 这里有什么不错的语法选项吗?考虑 kotlin 的前置条件语法:require(something != whatever) { "No good!" },而不是更冗长和类型为 ee 的 if(something != whatever){ throw new GradleException("No good!") }
    • GradleScriptException 的可怕之处在于它需要第二个参数来表示原因。
    • ... 当然我们避免说这是“异常编程”?!我有以这种方式编写的遗留代码,维护起来很可怕......在旧时代围绕make 的理念是rules(任务-s)成功或失败。我曾经尝试过return false -- Gradle 只是忽略它并继续运行。
    【解决方案2】:

    如果你想停止构建,抛出:

    throw new GradleException('error occurred')
    

    或抛出上述异常的子类。一些子类异常实际上只会使当前任务失败,但会继续构建。

    【讨论】:

      【解决方案3】:

      目前没有专门的方法,尽管已经讨论过要添加一个。

      停止 Gradle 构建的推荐方法是引发异常。由于 Groovy 没有检查异常,并且 Gradle 默认不打印异常类型,因此抛出哪个异常并不重要。在构建脚本中,经常使用 GradleException,但 Groovy 断言也似乎是合理的(取决于环境和受众)。重要的是提供明确的信息。添加原因(如果可用)有助于调试 (--stacktrace)。

      Gradle 提供专用的异常类型 StopExecutionException/StopActionException 用于停止当前任务/任务操作但继续构建。

      【讨论】:

        【解决方案4】:

        如果您以后不想捕获异常,另一种选择是调用 ant fail 任务。在我看来,它更容易阅读,并且您可以在不使用 --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 异常来轻松查看要捕获的异常。

        【讨论】:

        • 如何设置?叫它?
        • 只需调用 ant.fail('message of your choice') 无需设置
        • 它的输出看起来与使用 throw new GradleException("The sky is falling!!") (Gradle 3.4.1) 的输出相同
        • @mgaert 我似乎记得 4 年前我写这篇文章时,打印的信息确实不同(但那是很长一段时间,我不想弄清楚当时的版本是什么和检查)。除此之外,恕我直言 ant.fail 更清楚地传达了完全停止构建的意图,而抛出的异常读取为可能被捕获和处理的东西。
        【解决方案5】:

        抛出一个简单的 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.')
        }
        

        【讨论】:

          【解决方案6】:

          这是一个尝试模拟 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 时,没有输出。任何其他值都将打印标准输出并停止构建。

          注意:如果您的命令也写入 errorOutput,您可能需要将其包含在错误日志中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-18
            • 1970-01-01
            • 1970-01-01
            • 2019-01-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多