Gradle:Task # finalizedBy()

96
William_Huang
2019.07.19 18:58 字数 366

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