zoukankan      html  css  js  c++  java
  • Gradle构建脚本基础

    Gradle构建脚本,内部是基于 Groovy 的 DSL(领域特点语言),而Maven是基于XML的,Groovy相比XML更加简洁、灵活和强大。 Groovy 因为给 Java 开发人员提供了最大的透明度,对于Java开发人员来说门槛很低,所以Gradle的重点是Java项目。这篇不是介绍Groovy的文章,对于Gradle应该要了解一些Groovy的知识,比如闭包,在Gradle构建任务是就是经常用到的。建议在此之前先看完Groovy基础章节。好了,下面言归正传。

    Gradle 里的任何东西都是基于这两个基础概念:

    Projects 和 tasks

    • projects ( 项目 )
    • tasks ( 任务 )

    每一个构建都是由一个或多个 projects 构成的. 一个 project 到底代表什么依赖于你想用 Gradle 做什么. 举个例子, 一个 project 可以代表一个 JAR 或者一个网页应用. 它也可能代表一个发布的 ZIP 压缩包, 这个 ZIP 可能是由许多其他项目的 JARs 构成的. 但是一个 project 不一定非要代表被构建的某个东西. 它可以代表一件**要做的事, 比如部署你的应用.

    每一个 project 是由一个或多个 tasks 构成的. 一个 task 代表一些更加细化的构建. 可能是编译一些 classes, 创建一个 JAR, 生成 javadoc, 或者生成某个目录的压缩文件.

    我们先来看看定义构建里的一些简单的 tasks.

    一个 Task 包含若干 Action。所以,Task 有 doFirst 和 doLast 两个函数,用于添加需要最先执行的 Action 和需要和需要最后执行的 Action。Action 就是一个闭包。

    1、定义tasks

    task(hello) << {
        println "hello"
    }
    
    task(copy, type: Copy) {
        from(file('srcDir'))
        into(buildDir)
    }

    使用 strings 来定义任务的名字:

    task('hello') <<
    {
        println "hello"
    }
    
    task('copy', type: Copy) {
        from(file('srcDir'))
        into(buildDir)
    }

    Task 创建的时候可以指定 Type,通过 type: 名字表达。这是什么意思呢?其实就是告诉 Gradle,这个新建的 Task 对象会从哪个基类 Task 派生。比如,Gradle 本身提供了一些通用的 Task,最常见的有 Copy 任务。Copy 是 Gradle 中的一个类。当我们:task myTask(type:Copy)的时候,创建的 Task 就是一个 Copy Task。

    另外一种语法形式

    tasks.create(name: 'hello') << {
        println "hello"
    }
    
    tasks.create(name: 'copy', type: Copy) {
        from(file('srcDir'))
        into(buildDir)
    }

    这里实际上我们把任务加入到 tasks collection 中.

    2、第一个构建脚本

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

    在命令行里, 进入脚本所在的文件夹然后输入 gradle -q hello 来执行构建脚本。gradle 命令会在当前目录中查找一个叫 build.gradle 的文件. 我们称这个 build.gradle 文件为一个构建脚本 (build script), 但是严格来说它是一个构建配置脚本 (build configuration script). 这个脚本定义了一个 project 和它的 tasks.

    补充一点命令里的 -q 是干什么的?

    这个指南里绝大多说的例子会在命令里加入 -q. 代表 quite 模式. 它不会生成 Gradle 的日志信息 (log messages), 所以用户只能看到 tasks 的输出. 它使得的输出更加清晰. 你并不一定需要加入这个选项. 参考第 18 章, 日志的 Gradle 影响输出的详细信息.

    上面的脚本等价于:

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

    doLast 被替换成了 <<,二者是对等的。

    3、在 Gradle 任务里使用 Groovy

    例1

    task upper << {
        String someString = 'mY_nAmE'
        println "Original: " + someString
        println "Upper case: " + someString.toUpperCase()
    }

    gradle -q upper 命令的输出

    > gradle -q upper
    Original: mY_nAmE
    Upper case: MY_NAME

    例2

    task count << {
        4.times { print "$it " }
    }

    gradle -q count 命令的输出

    > gradle -q count
    0 1 2 3

    4、任务依赖

    task taskX(dependsOn: 'taskY') << {
        println 'taskX'
    }
    task taskY << {
        println 'taskY'
    }

    gradle -q taskX 命令的输出

    > gradle -q taskX
    taskY
    taskX

    注意:taskX 到 taskY 的依赖在 taskY 被定义之前就已经声明了.任务声明的顺序对于依赖顺序没有影响。

     5、动态任务

    3.times { counter ->
        task "task$counter" << {
            println "I'm task number $counter"
        }
    }

    这里动态的创建了 task1, task2, task3

    gradle -q task1 命令的输出

    > gradle -q task1
    I'm task number 1

    6、使用已经存在的任务

    • 通过API访问一个任务 - 加入一个依赖
    4.times { counter ->
        task "task$counter" << {
            println "I'm task number $counter"
        }
    }
    task0.dependsOn task2, task3
    > gradle -q task0
    I'm task number 2
    I'm task number 3
    I'm task number 0
    • 通过API访问一个任务 - 加入行为
    task hello << {
        println 'Hello Earth'
    }
    hello.doFirst {
        println 'Hello Venus'
    }
    hello.doLast {
        println 'Hello Mars'
    }
    hello << {
        println 'Hello Jupiter'
    }
    > gradle -q hello
    Hello Venus
    Hello Earth
    Hello Mars
    Hello Jupiter

    7、短标记法

    有一个短标记 $ 可以访问一个存在的任务. 也就是说每个任务都可以作为构建脚本的属性:

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

    这里的 name 是任务的默认属性, 代表当前任务的名称, 这里是 hello.

    > gradle -q hello
    Hello world!
    Greetings from the hello task.

    8、自定义任务属性

    你可以给任务加入自定义的属性. 列如加入一个叫做 myProperty 属性, 设置一个初始值给 ext.myProperty. 然后, 该属性就可以像一个预定义的任务属性那样被读取和设置了.

    task myTask {
        ext.myProperty = "myValue"
    }
    
    task printTaskProperties << {
        println myTask.myProperty
    }
    > gradle -q printTaskProperties
    myValue

    9、调用 Ant 任务

    Ant 任务是 Gradle 的一等公民. Gradle 通过 Groovy 出色的集成了 Ant 任务. Groovy 自带了一个 AntBuilder. 相比于从一个 build.xml 文件中使用 Ant 任务, 在 Gradle 里使用 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]}"
            }
        }
    }
    > gradle -q loadfile
    *** agile.manifesto.txt ***
    Individuals and interactions over processes and tools
    Working software over comprehensive documentation
    Customer collaboration  over contract negotiation
    Responding to change over following a plan
     *** gradle.manifesto.txt ***

    10、定义默认任务

    defaultTasks 'clean', 'run'
    
    task clean << {
        println 'Default Cleaning!'
    }
    
    task run << {
        println 'Default Running!'
    }
    
    task other << {
        println "I'm not a default task!"
    }

    gradle -q 命令的输出

    > gradle -q
    Default Cleaning!
    Default Running!

    11、通过 DAG 配置

    Gradle 有一个配置阶段和执行阶段. 在配置阶段后, Gradle 将会知道应执行的所有任务. Gradle 为你提供一个”钩子”, 以便利用这些信息. 举个例子, 判断发布的任务是否在要被执行的任务当中. 根据这一点, 你可以给一些变量指定不同的值.

    根据选择的任务产生不同的输出

    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'
        }
    }

    distribution 任务和 release 任务将根据变量的版本产生不同的值.

    > gradle -q distribution
    We build the zip with version=1.0-SNAPSHOT
    Output of gradle -q release
    > gradle -q release
    We build the zip with version=1.0
    We release now

    参考文章:Gradle 用户指南官方文档中文版

  • 相关阅读:
    带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。
    索引图像的那些事啊
    调整图像 自动对比度、自动色阶算法
    图像处理界双线性插值算法的优化
    共享收集的图像处理方面的一些资源和网站。
    Wellner 自适应阈值二值化算法
    基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
    VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
    关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识。
    限制对比度自适应直方图均衡化算法原理、实现及效果
  • 原文地址:https://www.cnblogs.com/jpfss/p/9883640.html
Copyright © 2011-2022 走看看