美文网首页
Gradle构建脚本基础

Gradle构建脚本基础

作者: 明明_白_白 | 来源:发表于2018-09-14 11:38 被阅读10次

    1.Build
    每个Project都会有一个Build文件,该文件是Project构建的入口,可以在这里针对该Project进行配置,比如配置版本,需要哪些插件,依赖哪些库等。
    比如我们在开发一个大型Java工程时,该工程被分为很多小模块,每个模块都是一个Child Project,这些模块同样也是Java工程,这种情况我们也可以统一配置,应用Java插件:

    subprojects{
    apply plugin: 'java'
    repositories{
    jcenter()
    }
    }
    除了提供的subprojects之外,还有allprojects,从其名字就可以看出来,是对所有Project的配置。但是大家不要误以为subprojects和allprojects只能配置。它们是两个方法,接受一个闭包作为参数,对工程进行遍历,遍历的过程中调用我们自定义的闭包,所以我们可以在闭包里配置、打印、输出或修改Project的属性都可以。
    2.任务依赖
    任务之间是可以有依赖关系的,这样我们就能控制哪些任务先于哪些任务执行。比如我们运行jar任务之前,compile任务一定要执行过,也就是jar依赖于compile。
    task ex<<{
    println "ex"
    }
    task exMain(dependsOn:ex){
    doLast{
    println "main"
    }
    }
    执行命令:gradle exMain
    输出:

    Task :ex
    ex
    Task :exMain
    main
    通过dependsOn可以指定依赖的任务,exMain任务依赖于ex,所以会先执行ex任务,然后再执行exMain任务。
    同时依赖多个任务:
    task ex<<{
    println "ex"
    }
    task ex2<<{
    println "ex2"
    }
    task exMain{
    dependsOn ex,ex2

    doLast{
        println "main"
    }
    

    }
    输出:

    Task :ex
    ex
    Task :ex2
    ex2
    Task :exMain
    main
    3.任务间通过API控制、交互
    创建一个任务和我们定义一个变量是一样的,变量名就是我们定义的任务名,类型是Task。所以我们可以通过任务名,使用Task的API访问它的方法、属性或者对任务重新配置等。
    和变量一样,要使用任务名操纵任务,必须先定义声明,因为脚本是顺序执行的:

    task ex3<<{
    println "ex3"
    }
    ex3.doFirst{
    println "doFirst"
    }
    ex3.doLast{
    println "doLast"
    }
    输出:

    Task :ex3
    doFirst
    ex3
    doLast
    如上示例,我们调用了doLast和doFirst方法,在任务执行前后做一些事情。对于直接通过任务名操纵任务的原理是:Project在创建的时候,同时把该任务对应的任务名注册为Project的一个属性,类型是Task。
    3.自定义属性
    Project和Task都允许用户添加额外的自定义属性,要添加额外的属性,通过应用所属对应的ext属性即可实现。添加之后可以通过ext属性对自定义属性读取和设置,如果要同时添加多个自定义属性,可以通过ext代码块:
    task ex4<<{
    //自定义一个Project的属性
    ext.age=18
    //通过代码块同时自定义多个属性
    ext{
    phone=1255
    address='北京'
    }
    println "年龄:{age}" println "电话:{phone}"
    println "地址:${address}"
    }
    输出:
    Task :ex4
    年龄:18
    电话:1255
    地址:北京
    相比于局部变量,自定义属性有更为广泛的作用域,你可以跨Project,跨Task访问这些自定义属性。
    自定义属性不仅仅局限在Project和Task上,还可以应用在SourceSet中,这样等于每种SourceSet又多了一个可供配置的属性。

    apply plugin:"java"

    //自定义一个Project的属性
    ext.age=18
    //通过代码块同时自定义多个属性
    ext{
    phone=1255
    address='北京'
    }
    sourceSets.all{
        ext.resourcesDir=null
    }
    sourceSets{
        main{
            resourcesDir='main/res'
        }
        test{
            resourcesDir='test/res'
        }
    }
    

    task ex4<<{
    println "年龄:{age}" println "电话:{phone}"
    println "地址:{address}" sourceSets.each{ println "{it.name}的resourcesDir是:${it.resourcesDir}"
    }
    }
    输出:

    Task :ex4
    年龄:18
    电话:1255
    地址:北京
    main的resourcesDir是:main/res
    test的resourcesDir是:test/res
    从程序运行可见,我们自定义的属性都生效了。在项目中一般使用它来自定义版本号和版本名称,把版本号和版本名称单独放在一个gradle文件中。。
    4.脚本即代码,代码也是脚本
    虽然我们在一个Gradle文件中写脚本,但是我们写的都是代码,这一点一定要记住,这样才能时刻使用Groovy、Java以及Gradle的任何语法和API帮你完成你想要做的事情。不要被脚本这两个字给限制住。在这个脚本文件上你可以定义Class、内部类、导入包、定义方法、常量、接口、枚举等,都是可以的,灵活运用。我们在项目中需要给生成的apk包以当前日期的格式命名,我们就定义一个获取日期格式的方法,用于生成apk的文件名:
    task ex5<<{
    def date=new Date()
    def formatDate=date.format('yyyyMMddMMSS')
    println "当前时间${formatDate}"
    }
    输出:
    Task :ex5
    当前时间2018082308619

    相关文章

      网友评论

          本文标题:Gradle构建脚本基础

          本文链接:https://www.haomeiwen.com/subject/cvfogftx.html