Error handling Gradle-插件应用期间抛出错误-“;未能通知ProjectEvaluationListener.afterEvaluate();

Error handling Gradle-插件应用期间抛出错误-“;未能通知ProjectEvaluationListener.afterEvaluate();,error-handling,gradle,Error Handling,Gradle,我希望在pluginapply方法中抛出一个错误,以便通知用户缺少的设置(并帮助他们修复)。我反复看到以下错误: 未能通知ProjectEvaluationListener.afterEvaluate(),但主配置失败优先。 我希望做两件事: 以正确的方式通知afterEvaluate() 避免产生巨大的堆栈跟踪-只需要异常消息 中的最后一条评论如下: >发生的情况是,即使apply()抛出异常,afterEvaluate闭包也会执行。 这并不奇怪。给afterEvaluate()的闭包是回调,

我希望在pluginapply方法中抛出一个错误,以便通知用户缺少的设置(并帮助他们修复)。我反复看到以下错误:

未能通知ProjectEvaluationListener.afterEvaluate(),但主配置失败优先。

我希望做两件事:

  • 以正确的方式通知afterEvaluate()
  • 避免产生巨大的堆栈跟踪-只需要异常消息
  • 中的最后一条评论如下:

    >发生的情况是,即使apply()抛出异常,afterEvaluate闭包也会执行。
    这并不奇怪。给afterEvaluate()的闭包是回调,即使求值失败也会激发。 您应该在afterEvaluate回调中检查项目的状态(),如果项目处于失败状态,则返回

    经过多次测试后,我无法找到构造对getState()的调用的正确方法

    gradle插件文件摘要:

    class j2objc implements Plugin<Project> {
    
        void apply(Project project) {
    
            project.afterEvaluate {
                // Setup basic paths
                def j2objcHome = System.getenv()['J2OBJC_HOME']
                if (j2objcHome == null) {
                    throw new InvalidUserDataException(
                            'j2objc home not set, <helpful instructions to fix>')
                }
    
                project.tasks.create(name: 'j2objcTranslate', type: Exec) {
                    // Should not be called if there's a failure
                    description 'Translates all the java source files in to Objective-C using j2objc'
                    // <implementation>
                }
            }
        }
    }
    
    j2objc类实现插件{
    无效申请(项目){
    项目后评估{
    //设置基本路径
    def j2objcHome=System.getenv()['J2OBJC_HOME']
    if(j2objcHome==null){
    抛出新的InvalidUserDataException(
    “未设置j2objc主目录,”)
    }
    project.tasks.create(名称:“j2objcTranslate”,类型:Exec){
    //如果出现故障,则不应调用
    description“使用j2objc将所有java源文件翻译成Objective-C”
    // 
    }
    }
    }
    }
    
    完整错误,包括我要隐藏的长堆栈跟踪的一部分:

    $ gradlew base:j2objcTranslate
    Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
    org.gradle.api.InvalidUserDataException: j2objc home not set, this can be set using J2OBJC_HOME environment variable or within build.gradle by adding: j2objcConfig { j2objcHome = <path> }, e.g. j2objcConfig { j2objcHome = "$projectDir/../j2objc/"}
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    <a huge number more lines>
    
    $gradlew base:j2objcTranslate
    未能通知ProjectEvaluationListener.afterEvaluate(),但主配置失败优先。
    org.gradle.api.InvalidUserDataException:j2objc home not set,可以使用j2objc_home环境变量或在build.gradle中通过添加:j2objcConfig{j2objcHome=},例如j2objcConfig{j2objcHome=“$projectDir/。/j2objc/”}来设置此参数
    位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
    位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    

    更新 父级渐变文件中存在错误。当这是固定的,它产生了更好的输出(复制如下)。即使如此,当出现多个故障时,如前所述,生成更好的错误消息也很好

    $ gradlew base:j2objcTranslate
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Script '/Users/brunobowden/dev/myproject/base/j2objc.gradle' line: 35
    
    * What went wrong:
    A problem occurred configuring project ':android'.
    > A problem occurred configuring project ':base'.
        > j2objc home not set, <helpful message>
    
    $gradlew base:j2objcTranslate
    失败:生成失败,出现异常。
    *其中:
    脚本'/Users/brunobowden/dev/myproject/base/j2objc.gradle'行:35
    *出了什么问题:
    配置项目“:android”时出现问题。
    >配置项目“:base”时出现问题。
    >未设置j2objc home,
    
    在我的案例中,添加安卓路径后,它成功了。

    应该忽略什么?插件不应该在评估后的
    中完成所有工作。可以立即执行环境检查,也可以立即添加任务。也许只有在任务执行时,或者只有在计划执行任务时,才应该执行环境检查。否则,即使像
    gradletasks
    这样的任务也会因“未设置j2objc home”而失败。还应该检查项目属性“j2objc”(扩展更好)或类似的属性,因为它比env variable.Opal更容易设置(例如在
    init.gradle
    ),注释是无意的。我看不到“删除评论”按钮,因此我将其措辞为忽略。Peter,感谢您的输入。我同意你的意见,它构建的代码是我在论坛上发布的内容的编辑版本:让我做另一个StackOverflow,我认为这更接近我访问扩展对象的真正问题。一个很好的例子是我在Gradleware的很多有用反馈的基础上开发的插件: