美文网首页
Gradle:Task # finalizedBy()

Gradle:Task # finalizedBy()

作者: HWilliamgo | 来源:发表于2019-07-19 18:58 被阅读0次

    Gradle:Task # finalizedBy()

    这篇文章对Gradle的Task对象的finalizedBy()方法做一个介绍

    1 官方文档

    接口说明:

    使用示例:

    https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:finalizer_tasks

    官方对这个方法只有只言片语的介绍,以下是我自己的理解。

    2 概述

    Task # finalizedBy(Object ... paths)

    为当前的task添加一个或若干个当前task结束后立马执行的task,且添加的task的执行顺序为无序。

    3 实例

    task A {
        finalizedBy "B"
        finalizedBy "C"
        finalizedBy "D"
        finalizedBy "E"
        doLast {
            println "A"
        }
    }
    task B {
        doLast {
            println "B"
        }
    }
    task C {
        doLast {
            println "C"
        }
    }
    task D {
        doLast {
            println "D"
        }
    }
    task E {
        doLast {
            println "E"
        }
    }
    

    执行命令:gradlew A

    打印:

    Task :A
    A

    Task :E
    E

    Task :D
    D

    Task :C
    C

    Task :B
    B

    打印出来的结果的确表明,finalizedBy()添加的后续执行的task的执行顺序是不确定的。

    无序的原因:

    这里要看一下gradle的源码,Task的实现类是AbstractTask

    finalizedBy()源码为:

    @Override
    public Task finalizedBy(final Object... paths) {
        taskMutator.mutate("Task.finalizedBy(Object...)", new Runnable() {
            public void run() {
                finalizedBy.add(paths);
            }
        });
        return this;
    }
    

    finalizedBy变量为DefaultTaskDependency finalizedBy

    查看他的add方法:

    //DefaultTaskDependency 
    public DefaultTaskDependency add(Object... values) {
        for (Object value : values) {
            addValue(value);
        }
        return this;
    }
    
    private void addValue(Object dependency) {
        if (dependency == null) {
            throw new InvalidUserDataException("A dependency must not be empty");
        }
        getMutableValues().add(dependency);
    }
    
    public Set<Object> getMutableValues() {
        if (mutableValues == null) {
            mutableValues = new TaskDependencySet();
        }
        return mutableValues;
    }
    

    finalizedBy是往一个Set类型的容器里面去添加task的,而Set在取的时候是无序的,所以后面执行就是无序的。

    4 结论

    1. finalizedBy(Object ... paths)方法的参数显示的是Object类型,但实际上用的时候要传递String类型字符串。
    2. finalizedBy()添加的task在执行的时候是无序的。
    3. finalizedBy()方法不能在Task执行的时候调用,即不能在doLast{}和doFirst{}里面调用,只能在Task构造的时候调用。

    相关文章

      网友评论

          本文标题:Gradle:Task # finalizedBy()

          本文链接:https://www.haomeiwen.com/subject/bgoslctx.html