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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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')

执行结果 :

以上是关于Android Gradle 插件自定义 Gradle 任务 ⑬ ( DefaultTask 中的任务输入和输出属性 | TaskInputs 任务输入接口 | FileCollection )的主要内容,如果未能解决你的问题,请参考以下文章

Android之Gradle的理解

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )

Android Gradle 插件自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ④ ( 为自定义 Gradle 插件的扩展配置扩展 | 在自定义插件中获取扩展属性 )