gradle笔记

configurations配置

configurations {
    wzp_imp.extendsFrom(implementation)//wzp_imp 可以是任何名称 继承 implementation配置
}


dependencies {
    wzp_imp "androidx.appcompat:appcompat:1.4.2" //使用自定义配置 wzp_imp添加依赖项
}

//使用自定义配置处理一些问题
//将wzp_imp添加的依赖复制到 toPath目录下
task mySelfConfigTask {
    def toPath = projectDir.absolutePath + "/lai"
    configurations.wzp_imp.files.forEach({item->
      
        copy {
            from(item.absolutePath)
            into(toPath)
        }
    })
}


//模仿 configurations 语法自己实现 配置方式一

class DomObj {
    String name//必须添加 name字段
    String msg

    DomObj(String name) {
        this.name = name
    }

    void msg(String msg) {
        this.msg = msg
    }

    @Override
    String toString() {
        return "name = ${name},msg = ${msg}"
    }
}

//扩展类
class WzpExtension {
//创建NamedDomainObjectContainer容器
    NamedDomainObjectContainer<DomObj> wzpCon
    WzpExtension(Project project) {
        wzpCon = project.container(DomObj)//获取容器
    }


    void appConfig(Action<NamedDomainObjectContainer<DomObj>> action) {
        action.execute(wzpCon)// 执行 action
    }

    void test() {
        wzpCon.all {
            println it
        }
    }

   
}


//添加一个扩展到项目里,
getExtensions().create("myExt", WzpExtension, project)
//使用扩展
myExt {
//执行WzpExtension里的appConfig方法
    appConfig {
//生成 DomObj  name属性的值name1 ,msg属性的值为 msg1
        name1 {
            msg "msg1"
        }
//生成 DomObj  name属性的值name2 ,msg属性的值为 msg2
        name2 {
            msg "msg2"
        }
    }
  //此时WzpExtension里的wzpCon 里包含了 两个DomObj  
    test()
}

//模仿 configurations 语法自己实现 配置方式二

class MyBing {
    def name = ""
    def msg = ""

    def msg(String arg) {
        msg = arg
    }
}

class MyDemo {
    List<MyBing> ali = new ArrayList<>()

  //调用不存在的方法时候会调用这个方法
    @Override
    Object invokeMethod(String methodName, Object bils) {
    //创建一个 MyBing
        MyBing myBing = new MyBing()
        myBing.name = methodName
    
        //绑定 闭包代理
        Closure bi = bils[0]//获取方法的第一个参数,可以有多个参数
        bi.delegate = myBing;
        bi.setResolveStrategy(Closure.DELEGATE_FIRST)//设置代理策略
        bi.call()执行闭包方法
        ali.push(myBing)
        return null
    }

    void test() {
        ali.each {
            println "name:${it.name},msg:${it.msg}"
        }
    }

}


task testMyExt {
    MyDemo myDemo = new MyDemo()
    Closure myCus = {
    //MyDemo里的不存在name1方法所以会自动调用invokeMethod方法。
        name1
                {
                    msg "msg1"
                }

        name2
            {
                msg "msg2"
            }

      

    }
  //绑定闭包代理
    myCus.delegate = myDemo
    myCus.setResolveStrategy(Closure.DELEGATE_FIRST)
    myCus()
    myDemo.test()
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容