美文网首页
Gradle第5课:Gradle 中的任务探密和实践

Gradle第5课:Gradle 中的任务探密和实践

作者: 米饭超人 | 来源:发表于2018-08-28 11:08 被阅读50次

    需要准备

    • 一个熟悉的 IDE 开发工具
    • JDK 7及以上
    • Gradle 3.2以上

    工程和任务的关系

    在 Gradle 的世界中最重要的两个概念就是:工程( Project )和任务( Task )。

    每一个 Gradle 的项目都会包含一个或多个工程,而每一个工程的职责又取决于我们对这个工程的定义,比如:一个工程可能是公共的 JAR 库,或者是一个 WEB 的应用程序,也可能是一个用于发布部署的 ZIP 包,而这个 ZIP 包又是通过其它工程编译打包的 JAR 文件组装成的。Gradle 的编译思想跟 maven 一样, 也是约定优于配置,不过 Gradle 又比 maven 灵活,它为工程提供了很多具体的配置项。

    每一个工程又由一个或多个任务组成,一个任务代表了一个工作的最小单元,它可以是一次类的编译、打一个 JAR 包、生成一份 Javadoc 或者是向仓库中提交一次版本发布。

    接下来我们就一步步的了解如何定义和使用任务来实现不同的编译打包功能,我们会先在一个独立的工程中实现一些任务,然后再扩展到多个工程中去。

    任务的定义和使用

    当我们使用 Gradle 的命令时,比如gradle build,Gradle 命令会去寻找当前目录下的 build.gradle 的文件,这个文件是 Gradle 的脚本文件,它里面定义了工程和工程拥有的所有任务等信息。

    我们还是使用 IDEA 开发工具打开之前的 HelloWorld 项目工程,把之前 build.gradle 文件中所有的内容全部删除,开始今天的任务编写。

    首先我们定义一个很简单的任务hello,其代码如下:

    然后打开命令行端终,执行命令:gradle -q hello,这时我们看到控制台成功的打印输出了“Hello world!”,如下图:

    enter image description here

    在以上代码中,我们定义了一个 hello 的任务,然后为它添加了一个动作( action ),当执行gradle hello命令时,该命令会调用 hello 任务,然后执行它的动作,打印输出了“ Hello world!”,这个动作是一个 groovy 的闭包函数。

    如果大家对 ant 熟悉的话,可能会觉得 Gradle 的任务是不是和 ant 的相似?确定是的,不过 Gradle 的任务比 ant 的灵活方便很多,在 Gradle 中我们可以像写代码一样地实现很多 ant 很难实现的功能。

    对于上面 hello 任务的定义,我们可以使用一种更简单便捷的方式实现。我们可以使用<<操作符来代替上面的 doLast 方法,如下:

    task hello << {
        println 'Hello world!'
    }
    

    任务的依赖关系

    我们可以定义一个任务依赖于某个其它的任务,比如一个发布( release )任务必须依赖编译( build )任务,代码如下:

    task build {
        doLast {
            println "i'm build task"
        }
    }
    
    task release(dependsOn: build) {
        doLast {
            println "I'm release task"
        }
    }
    

    然后再执行gradle -q release,其输出结果如下:

    enter image description here

    对现有任务的操作

    1.对现有的任务添加依赖关系

    task build {
        doLast {
            println "i'm build task"
        }
    }
    
    task release() {
        doLast {
            println "I'm release task"
        }
    }
    
    // 添任务依赖关系
    release.dependsOn build
    

    其执行结果“图二“一样。

    2.对现有的任务添加动作行为

    task hello {
        doLast {
            println 'Hello World!'
        }
    }
    
    // 法方一,在doFirst动作中添加
    hello.doFirst {
        println 'Hello doFirst'
    }
    
    // 法方二 在doLast动作中添加
    hello.doLast {
        println 'Hello doLast1'
    }
    
    // 法方三 在doLast动作中添加
    hello {
        doLast {
            println 'Hello doLast2'
        }
    }
    

    执行gradle -q hello其结果如下:

    enter image description here

    3.访问现有任务的属性值

    task hello {
        doLast {
            println "Hello world! from the $hello.name task."
        }
    }
    

    执行gradle -q hello其结果如下:

    enter image description here

    另外我们还可以为任务设置属性,主要通过 ext.myProperty 来初始化值,如下所示:

    task myTask {
        ext.myProperty = "myValue"
    }
    
    task printTaskProperties {
        doLast {
            println myTask.myProperty
        }
    }
    

    其输出结果为:

    > gradle -q printTaskProperties
    myValue
    

    4.在任务中调用 groovy 方法

    task hello {
        doLast {
            int a = 1,b = 2;
            int result = add(a,b);
            println "a add b is = " + result;
        }
    }
    
    int add(int a,int b) {
        a + b;
    }
    

    执行gradle -q hello其结果如下:

    enter image description here

    总结

    使用 Gradle 编译工程,其实就是在编译不同的任务,然后根据依赖关系组合执行,最后完成整个项目工程的打包发布。从工程和任务的关系,我们也能看到 Gradle 把“分而治之”思想运用得恰到好处,实现中我们一个项目可能包含若干个工程,这样使用Gradle就能很好地自动化编译发布了。

    相关文章

      网友评论

          本文标题:Gradle第5课:Gradle 中的任务探密和实践

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