【Android Gradle 插件】自定义 Gradle 任务 ⑬ ( DefaultTask 中的任务输入和输出属性 | TaskInputs 任务输入接口 | FileCollection )

Android Plugin DSL Reference 参考文档 :





一、DefaultTask 中的任务输入和输出属性 ( DefaultTask#taskInputs | DefaultTask#taskOutputs )



自定义 Gradle 任务继承了 DefaultTask 类 , 原型如下 :

public class DefaultTask extends AbstractTask implements Task {
    
    
}

DefaultTask 又继承了 AbstractTask 类 , 在 AbstractTask 类中 , 有 taskInputs 和 taskOutputs 两个成员变量 , 分别代表任务的 输入 和 输出 ;

public abstract class AbstractTask implements TaskInternal, DynamicObjectAware {
    
    

    private final TaskInputsInternal taskInputs;
    private final TaskOutputsInternal taskOutputs;

    public TaskInputsInternal getInputs() {
    
    
        return this.taskInputs;
    }
}

除直接赋值外 , 还可以使用 TaskInputsInternal taskInputs 和 TaskOutputsInternal taskOutputs 这两个属性 , 设置 输入 和 输出 ;





二、TaskInputs 任务输入接口



TaskInputsInternal 接口继承了 TaskInputs 接口 ,

public interface TaskInputsInternal extends TaskInputs, TaskDependencyContainer {
    
    
    void visitRegisteredProperties(PropertyVisitor var1);
}

TaskInputs 接口内容如下 :

public interface TaskInputs {
    
    
    boolean getHasInputs();

    FileCollection getFiles();

    TaskInputFilePropertyBuilder files(Object... var1);

    TaskInputFilePropertyBuilder file(Object var1);

    TaskInputFilePropertyBuilder dir(Object var1);

    Map<String, Object> getProperties();

    TaskInputPropertyBuilder property(String var1, @Nullable Object var2);

    TaskInputs properties(Map<String, ?> var1);

    boolean getHasSourceFiles();

    FileCollection getSourceFiles();
}




二、TaskInputs#file 函数



调用 TaskInputs#file 函数 , 可设置输入文件 , 函数原型如下 :

TaskInputFilePropertyBuilder file(Object var1);

在自定义 Gradle 任务中 , 可以调用 TaskInputs#getFiles 函数 , 获取设置的输入文件集合 , 类型为 FileCollection , 函数原型如下 :

FileCollection getFiles();




三、FileCollection 文件集合



调用 TaskInputs#getFiles 函数获得 FileCollection 文件集合 , 这是一个迭代器 , 可以获取其中的文件 ;


FileCollection 原型如下 :

public interface FileCollection extends Iterable<File>, AntBuilderAware, Buildable {
    
    
    File getSingleFile() throws IllegalStateException;

    Set<File> getFiles();

    boolean contains(File var1);

    String getAsPath();

    FileCollection plus(FileCollection var1);

    FileCollection minus(FileCollection var1);

    FileCollection filter(Closure var1);

    FileCollection filter(Spec<? super File> var1);

    boolean isEmpty();

    FileTree getAsFileTree();

    @Incubating
    Provider<Set<FileSystemLocation>> getElements();

    void addToAntBuilder(Object var1, String var2, FileCollection.AntType var3);

    Object addToAntBuilder(Object var1, String var2);

    public static enum AntType {
    
    
        MatchingTask,
        FileSet,
        ResourceCollection;

        private AntType() {
    
    
        }
    }
}

FileCollection#first 函数获取文件集合中第一个文件

该方法是定义在 DefaultGroovyMethods 类中的 Iterable 扩展方法 , FileCollection 继承了Iterable<File> 类 , 因此也可以调用 Iterable#first 函数 , 获取集合中的第一个元素 ;

public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
    
    
    public static <T> T first(Iterable<T> self) {
    
    
        Iterator<T> iterator = self.iterator();
        if (!iterator.hasNext()) {
    
    
            throw new NoSuchElementException("Cannot access first() element from an empty Iterable");
        } else {
    
    
            return iterator.next();
        }
    }
}

FileCollection#singleFile 函数获取文件集合中唯一的文件

调用 FileCollection#singleFile 函数获取文件集合中唯一的文件 , 函数原型如下 :

    File getSingleFile() throws IllegalStateException;




四、代码示例



代码示例 :

/**
 * 自定义任务类
 */
class MyTask extends DefaultTask {
    
    

    MyTask() {
    
    
        // 设置该任务属于 MyTaskGroup 分组
        group 'MyTaskGroup'
        description 'MyTask Description'
    }

    /**
     * 使用 @TaskAction 注解指定任务需要执行的方法
     */
    @TaskAction
    void run() {
    
    
        println 'MyTask'

        // 获取第一个输入文件
        println inputs.getFiles().first()
        // 获取独立文件
        println inputs.getFiles().singleFile
    }
}

/*
    生成自定义 Gradle 任务
 */
task myTask(type: MyTask){
    
    
    // 设置输入文件
    inputs.file file('input.txt')
}

执行结果 :

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/127015899