安装到构建基础

gradle
gradle下载:
    https://gradle.org/install
安装:
    解压缩,将包拷贝到你想要的安装环境
    配置环境:
        GRADLE_HOME/bin配置到你的path环境变量中
    测试安装
        gradle -v

 

构建基础
    Project和tasks是Gradle中最重要的概念
    任何一个Gradle构建都是由一个或者多个projects组成,每个project可包括许多可构建组成部分,这完全取决于你要构建些什么。举个栗子,project可以是一个jar或者一个web应用,也可以是由许多项目中产生的jar构成的zip。一个project不必描述它只能进行构建操作。它也可以部署你的应用或搭建你的环境。
    Gradle的build-by-convention可以让您具体定义一个project到底应该做什么。
    
    每个project都由多个tasks组成,每个task都代表了构建执行过程中的一个原子性操作。如打包,编译,生成javadoc,发布到某个仓库等操作
    可以发现,我们可以在一个project中定义一些简单任务
    
Hello World
    通过运行gradle命令执行构建,gradle命令会从当前目录下寻找build.gradle文件来执行构建。我们成build.gradle文件为构建脚本。严格来说这其实是一个构建配置脚本,后面您会了解到这个构建脚本定义了一个project和一些默认的task
    
    第一个构建脚本:
        task hello{
            doLast{
                print 'Hello World!'
            }
        }
    执行脚本:
        在脚本所在目录下运行 gradle -q hello
        上面的脚本定义了一个叫hello的task,当执行gradle hello时,Gradle便会去调用hello这个任务来执行给定操作。

快速定义任务
    可以用更简洁的方式定义上面的hello任务:
        task hello <<{
            println 'Hello World!'
        }
        build.gradle中的注释://
        
代码即脚本
    Gradle脚本采用Groovy书写,最为开胃菜,看下面这个栗子:
        task upper <<{
            String someString = "mY_nAmE"
            println "Original:" + someString
            println "Upper case:" +someString.toUpperCase()
        }
        或者
        task count <<{
            4.time{
                print "$it"
            }
        }

任务依赖
    你可以按照如下方式创建任务之间的依赖关系
    在两个任务之间指明依赖关系:
        task hello <<{
            println 'Hello World!'
        }    
        task intro(dependsOn: hello) <<{
            println "I'm Gradle"
        }
    添加依赖task也可以不必首先声明被依赖的task
    延迟依赖
        task taskX(dependsOn: 'taskY') <<{
            println 'taskX'
        }
        task taskY <<{
            println 'taskY'
        }
    注意:当引用的任务尚未定义的时候不可使用短标记法
    
动态任务Dynamic tasks
    创建动态任务:
        4.times{
            counter ->
            task "task$counter" <<{
                println "I'm task number $counter"
            }
        }
    执行:gradle -q task1  1是在0~3间可变的

任务操纵Manipulating existing tasks
    一旦任务被创建后,任务之间可以通过API进行访问。这也是与Ant的不同之处。比如可以增加一些依赖
    
    通过API进行任务之间的通信 - 增加依赖
    4.times{
        counter ->
        task "task$counter" <<{
            println "I'm task number $counter"
        }
    }
    task0.dependsOn task2 , task3
    
    执行:gradle -q task0
    
    通过API进行任务之间的通信 - 增加任务行为
    task hello <<{
        println "Hello Earth"
    }
    hello.doFirst{
        println "Hello Venus"
    }
    hello.doLast{
        println 'Hello Mars'
    }
    hello <<{
        println "Hello Jupiter"
    }
    doFirst和doLast可以多次调用。它们被分别添加在任务的开头和结尾。当任务开始执行时这些动作会按照既定顺序进行。其中<<操作符号时doLast的简写方式

短标记法Shortcut notations
    也许你早就注意到了,没错,每一个任务都是一格脚本的属性,你可以访问它:
    以属性的方式访问任务
    task hello <<{
        println "Hello World!"
    }
    hello.doLast{
        println "Greetings from the $hello.name task."
    }
    对于插件提供的内置任务,这尤其方便(例如:complie)
    
添加自定义属性Extra task properties
你可以为一个任务添加额外的属性。例如一个叫做myProperty的属性,用ex.myProperty的方式给他一个初始值,这样便增加了一个自定义属性。
    为任务添加自定义属性
    task myTask {
        ext.myProperty = "myValue"
    }
    task printTaskProperties <<{
        println myTask.myProperty
    }
    上一个任务不能加<<,不知道为什么
    
调用Ant任务 using Ant Tasks
    Ant任务是Gradle中的一等公民。Gradle借助Groovy对Ant任务进行了优秀的整个。Gradle自带了一个AntBuilder,在Gradle中调用Ant任务比在build.xml中调用更加方便和强大。下面的例子你可以学到如何调用一个Ant任务以及如何与Ant中的属性进行通信
    
    利用AntBuilder执行ant.loadfile
    task loadfile <<{
        def files = file('antLoadfileResources').listFiles().sort()
        files.each{
            File file ->
            if(file.isFile){
                ant.loadfile(srcFile:file , property : file.name)
                println "***$file.name***"
                println "${ant.properties[file.name]}"
            }
        }
    }
    这个我不太会,没执行成功。
    
方法抽取Using method
    Gradle的强大要看你如何编写脚本逻辑.针对上面的例子,首先要做的就是要抽取方法。
    利用方法组织逻辑脚本
    task checksum <<{
        fileList('antLoadfileResources').each{File file ->
            ant.checksum(file: file , property : cs_$file.name)
            println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
        }
    }
    task loadfile <<{
        fileList('antLoadfileResources').each{
            File file ->
            ant.loadfile(srcFile: file , property: file.name)
            println "I'm fond of $file.name"
        }
    }
    File[] fileList(String dir){
        file(dir).listFiles({file -> file.isFile()} as FileFilter).sort()
    }
    
定义默认任务 Default tasks
    Gradle 允许在脚本中定义多个默认任务
    defaultTasks 'clean' , 'fun'

    task clean <<{
        println 'Default Cleaning!'
    }
    task fun <<{
        println 'Default Running!'
    }
    task other <<{
        println "I'm not a default task!"
    }
    这样的话直接gradle -q就可以执行了。
    这与直接调用gradle clean run效果是一样的。在多项目构建中,每个子项目都可以指定单独的默认任务。如果子项目未进行指定将会调用父项目指定的默认任务
    
Configure by DAG
稍后会对Gradle的配置阶段和运行阶段进行详细说明,配置阶段后,Gradle会了解所有要执行的任务,Gradle提供了一格钩子来捕获这些信息,一格例子就是可以检查已经执行的任务中有没有被释放,借由此,你可以未一些变量赋予不同的值
    下面的例子中,未distribution和release任务赋予了不同的version值
    
    依赖任务的不同输出

task distribution <<{
        println "We build the zip with version = $version"
    }
    task release(dependsOn : 'distribution') <<{
        println "we release now"
    }
    gradle.taskGraph.whenReady{taskGraph ->
        if(taskGraph.hasTask(release)){
            version = '1.0'
        }else{
            version = '1.0-SNAPSHOT'
        }
    }

posted @ 2017-03-16 14:10  guodaxia  阅读(99)  评论(0)    收藏  举报