前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android Gradle 插件】自定义 Gradle 任务 ⑬ ( DefaultTask 中的任务输入和输出属性 | TaskInputs 任务输入接口 | FileCollection )

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

作者头像
韩曙亮
发布2023-03-30 17:08:44
1.2K0
发布2023-03-30 17:08:44
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

Android Plugin DSL Reference 参考文档 :

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


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

代码语言:javascript
复制
public class DefaultTask extends AbstractTask implements Task {
}

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

代码语言:javascript
复制
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 接口 ,

代码语言:javascript
复制
public interface TaskInputsInternal extends TaskInputs, TaskDependencyContainer {
    void visitRegisteredProperties(PropertyVisitor var1);
}

TaskInputs 接口内容如下 :

代码语言:javascript
复制
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 函数 , 可设置输入文件 , 函数原型如下 :

代码语言:javascript
复制
TaskInputFilePropertyBuilder file(Object var1);

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

代码语言:javascript
复制
FileCollection getFiles();

三、FileCollection 文件集合


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

FileCollection 原型如下 :

代码语言:javascript
复制
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 函数 , 获取集合中的第一个元素 ;

代码语言:javascript
复制
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 函数获取文件集合中唯一的文件 , 函数原型如下 :

代码语言:javascript
复制
    File getSingleFile() throws IllegalStateException;

四、代码示例


代码示例 :

代码语言:javascript
复制
/**
 * 自定义任务类
 */
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')
}

执行结果 :

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、DefaultTask 中的任务输入和输出属性 ( DefaultTask#taskInputs | DefaultTask#taskOutputs )
  • 二、TaskInputs 任务输入接口
  • 二、TaskInputs#file 函数
  • 三、FileCollection 文件集合
    • FileCollection#first 函数获取文件集合中第一个文件
      • FileCollection#singleFile 函数获取文件集合中唯一的文件
      • 四、代码示例
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档