• Android学习笔记 1.2.7 自定义任务 && 1.2.8 自定义插件


    Android学习笔记

    疯狂Android讲义

    第1章 Android 应用和开发环境

    1.2 使用Gradle自动化构建项目
    1.2.7 自定义任务

    自定义任务就是一个实现Task 接口的 Groovy类,该接口定义了大量抽象方法需要实现,因此一般自定义任务类会继承DefaultTask基类。自定义任务的Groovy类可以自定义多个方法,这些方法可作为Action使用。
    自定义任务的Groovy类既可直接定义在 build.gradle文件中,也可使用专门的Groovy源文件定义。

    新建gradle项目

    构建文件

    // 继承DefaultTask定义自定义任务
    class HelloWorldTask extends DefaultTask {
        @Optional
        def message = '疯狂软件教育中心'
        // 使用@TaskAction修饰的方法被自动当成Action
        @TaskAction
        def test(){
            println "test:$message"
        }
        def info(){
            println "info:$message"
        }
    }
    task hello(type: HelloWorldTask){
        doLast{
            info()
        }
    }
    task hello1(type: HelloWorldTask){
        message = "疯狂java联盟"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    通过命名 gradle hello运行工程

    在这里插入图片描述

    构建失败了

    * What went wrong:
    A problem was found with the configuration of task ':hello' (type 'HelloWorldTask').
      - Type 'HelloWorldTask' property 'message' is missing an input or output annotation.
        
        Reason: A property without annotation isn't considered during up-to-date checking.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    粗略一看,什么什么缺失了,

    试试编译器给我们的“可能”的解决办法

    在这里插入图片描述

    在这里插入图片描述

    再试一次

    在这里插入图片描述

    在这里插入图片描述

    没毛病。

    上面这种自定义任务的方式虽然简单,但会使得自定义任务类被直接放在build.gradle文件中,从而导致build.gradle文件比较混乱。当自定义任务较少且比较简单时,可以采用这种方式,但是当自定义任务较多或比较复杂时,建议采用专门的 Groovy源文件来自定义任务。
    自定义任务的源代码属于项目构建的源代码,因此 Gradle约定将这些源代码放在 buildSrc目录下。buildSrc目录就相当于另一个 Gradle项目,Gradle执行时会先构建buildSrc目录下的 Groovy源代码以供build.gradle文件使用。

    package org.fkjava
    
    import org.gradle.api.*
    import org.gradle.api.tasks.*
    
    /**
     * ClassName: ShowTask
     * date: 2022/8/13 15:24
     * @author DingJiaxiong
     */
    class ShowTask extends DefaultTask{
        @Internal
        File file = new File('dist.txt')
        @TaskAction
        def show(){
            println file.text
        }
        @TaskAction
        def multiShow(){
            println "---------"
            println file.text
            println "---------"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    构建文件

    // 使用Groovy文件中的task
    task show(type : org.fkjava.ShowTask)
    
    task show1(type: org.fkjava.ShowTask){
        //对file属性赋值
        file = file("g:/gradletest.txt")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    命令运行

    在这里插入图片描述

    1.2.8 自定义插件

    所谓自定义插件,其实就是一个实现 Plugin接口的类,实现该接口要求必须实现apply(Project project)方法,接下来就可以在该方法中为Project添加属性和定义任务了——正如前面所介绍的,所谓插件,无非就是为 Project定义多个属性和任务,这样引入该插件后即可使用这些属性和任务。

    直接在构建文件中定义一个自定义插件类

    // 实现Plugin定义自定义插件
    class FirstPlugin implements Plugin<Project> {
        // 重写接口中apply方法
        void apply(Project project){
            // 为项目额外定义一个User类型的user属性
            project.extensions.create("user", User)
            // 调用task方法定义showName任务
            project.task('showName') {
                doLast{
                    println '用户名:' + project.user.name
                }
            }
            // 调用tasks对象(TaskContainer)的create方法定义showPass任务
            project.tasks.create('showPass') {
                doLast {
                    println '密码:' + project.user.pass
                }
            }
        }
    }
    class User {
        String name = 'DingJiaxiong'
        String pass = '123'
    }
    // 引入FirstPlugin插件
    apply plugin: FirstPlugin
    // 为Project的user属性的name属性赋值
    user.name = "丁家雄"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行命令 gradle showName

    在这里插入图片描述

    gradle showPass

    在这里插入图片描述

    与自定义任务类似的是,自定义插件其实也应该使用专门的Groovy源文件定义,这些用于自定义插件的Groovy类也应该被放在 buildSrc目录下。

    itemPlugin.groovy

    package org.fkjava
    
    import org.gradle.api.*
    
    /**
     * ClassName: itemPlugin
     * date: 2022/8/13 15:50
     * @author DingJiaxiong
     */
    class ItemPlugin implements Plugin<Project> {
        // 重写接口中apply方法
        void apply(Project project){
            // 为项目额外定义一个Item类型的item属性
            project.extensions.create("item", Item)
            // 调用task方法定义showInfo任务
            project.task('showItem') {
                doLast{
                    println '商品名:' + project.item.name
                    println '商品销售价:' + project.item.price * project.item.discount
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Item.groovy

    package org.fkjava
    
    /**
     * ClassName: item
     * date: 2022/8/13 15:55
     * @author DingJiaxiong
     */
    class Item {
        String name = 'buzhidao'
        double price = 0
        double discount = 1.0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    引入插件

    // 引入org.fkjava.ItemPlugin插件
    apply plugin: org.fkjava.ItemPlugin
    // 为org.fkjava.ItemPlugin插件所扩展的项目属性赋值
    item.name='疯狂Android讲义66666'
    item.price = 108
    item.discount = 0.75
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行命令,调用任务

    在这里插入图片描述

  • 相关阅读:
    每个文件夹名称空格中添加文字重命名方法
    对接保时捷及3PL EDI案例
    一文解决Cellphonedb单细胞互作分析及可视化作图(2)
    第一型曲面积分的第二型曲面积分的区别与联系【从几何知识的角度思考】
    (02)Cartographer源码无死角解析-(17) SensorBridge→里程计数据处理与TfBridge分析
    javascript深浅拷贝
    cpu和gpu已过时,npu和apu的时代开始
    Swin Transformer与Vision Transformer的区别与联系
    Python高级篇(07):迭代器
    关于学生使用flowus的一些事
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126435473