美文网首页Android开发
Gradle学习2——开始使用Gradle

Gradle学习2——开始使用Gradle

作者: sososeen09 | 来源:发表于2017-10-14 16:52 被阅读278次

    学习本系列前可以下载相关的github项目gradleLearnDemo
    地址:https://github.com/sososeen09/gradleLearnDemo

    0 前言

    如果把Gradle当做脚本来学习,对于那么多的DSL配置,我们似乎难以下手。在这一点上,我认为邓凡平的深入理解Android之Gradle这篇文章讲的很好,把Gradle当做一个编程框架来学习,这篇文章可以让我们从一个不同的视角来学习和理解Gradle。

    1 Gradle 之hello world

    新建一个build.gradle文件,然后输入以下内容

    //task是一个任务,doLast 是一个action
    task helloWorld {
        println 'hello world!'
        doLast {
            println 'hello World! do last'
        }
    }
    

    输入命令 gradle helloWorld,执行helloWorld这个task。结果如下:

    hello world!
    :helloWorld //这个代表的是helloWold任务
    hello World! do last
    

    可以看到task中的内容正确的执行了,在task中 doLast是一个action,此外还有一个叫作doFirst的action。doFirst、doLast都是闭包。顾名思义就是再任务开始执行的开始和最后执行该闭包中的内容。

    对于doLast这个action,可以使用一个简单的左移操作符来替代:

    //可以使用左移符号 << 来简单的代表doLast
    task name << {
        println 'this is doLast action'
    }
    

    2 Gradle的命令

    Gradle的执行有很多有用的命令,运行gradle --help就可以查看这些命令。

    2.1 命令行选项

    -?, -h, –help 打印所有可用的命令行选项,包含描述信息
    -b, –build-file gradle构建脚本的默认命名约定为build.gradle ,使用这个命令可以执行一个指定名字的构建脚本(比如,gradle -b test.gradle)。
    –offline 可以在离线模式下构建,仅在本地缓存中检查依赖是否存在。

    2.2 参数选项

    -D, –system-prop Gradle是以一个JVM进程运行的。和所有的Java进行一样,你可以提供一个系统参数 (例如 -Dmyprop=myvalue)。
    -P, –project-prop 项目参数是构建脚本中可用的变量,可以使用这个选项直接向构建脚本中传入参数(如 -Pmyprop=myvalue)。

    2.3 日志选项

    -i, –info 在默认设置中,Gradle构建不会提供大量的输出信息。通过这个选项可以将Gradle的日志级别改变到INFO以获得更多信息。
    -s, –stacktrace 如果构建在运行中出现错误,-s选项在有异常抛出时会打印简短的堆栈跟踪信息,帮助你进行调试。
    -q, –quiet 只在出错的时候打印信息

    2.4 帮助任务

    tasks :显示项目中所有可运行的task,包括它们的描述信息。项目中应用的插件可能会提供一些额外的task。
    properties:显示出项目中的所有可用的属性。某些属性是由Gradle的project对象提供的,project对象是一个构建的本质表现形式。其它的属性都是用户自行一的,要么来自于属性文件或者命令行选项,要么是直接在构建脚本重定义的。

    例如:

    1. gradle -q helloworld
      表示静默执行helloworld任务 。-q 的意思是 quiet,也可以不带q
    2. gradle -q tasks
      列出gradle中的task
    3. gradle -q tasks –all
      列出gradle中更多的task

    当然了这个命令行我们不需要死记硬背,忘记怎么使用的时候,运行一下 gradle --help命令即可查阅相关的命令。

    3 守护进程

    gradle有一个命令--daemon可以用来开启一个守护进程,这个守护进程以后台方式运行。开启完守护进程之后,下一次运行构建的将会变快,这是因为减少了启动Gradle的开销。

    执行下面的代码:

    task helloWorld {
        doFirst{
           println 'hello World! do first'
        }
    
        println 'hello world!'
    
        doLast {
            println 'hello World! do last'
        }
    }
    

    默认情况下,我们使用gradle helloWorld命令,可以看一下执行的时间:

    hello world!
    :helloWorld
    hello World! do first
    hello World! do last
    
    BUILD SUCCESSFUL
    
    Total time: 2.787 secs
    

    然后我们使用命令 gradle --daemon helloWorld 运行构建

    hello world!
    :helloWorld
    hello World! do first
    hello World! do last
    
    BUILD SUCCESSFUL
    
    Total time: 4.522 secs
    

    WTF,不是说开启守护进程,构建时间会减少吗,怎么还变多了?
    不要急,我们再来运行一次 gradle --daemon helloWorld看看:

    hello world!
    :helloWorld
    hello World! do first
    hello World! do last
    
    BUILD SUCCESSFUL
    
    Total time: 1.228 secs
    

    看到了没,这一次时间减少了很多。第一次构建时间变长是因为后台开启�这个守护进程也是需要开销的,但是开启了守护进程之后我们就可以轻快的玩耍了。

    需要注意的是:

    1. 守护进程只会被创建一次
    2. 守护进程会在3小时空闲时间之后自动过期
    3. 想要重用守护进程,构建的时候要加上--daemon选项

    --no-daemon 选项可以选择执行构建时不使用守护进程。
    gradle --stop 命令可以手动停止守护进程。

    3 Gradle Wrapper 包装器

    在从Eclipse切换到Android Studio进行Android开发的时候,我在很长一段时间都不明白这个gradle Wrapper有什么作用。直到学习了Gradle的构建才了解到它的重要作用。
    Gradle包装器是Gradle的核心特性,能够让机器在没有安装Gradle运行时的情况下运行Gradle构建,也可以让构建脚本运行在一个指定的Gradle版本上。
    使用Wrapper被认为是最佳实践,这样在不同的机器上面,构建的版本就能够保证统一。使用了包装器的Gradle脚本非常适合作为自动化发布的一部分,比如持续集成。

    3.1 配置包装器

    为了能够让项目下载压缩过的Gradle运行时文件,定义一个类型为Wrapper的任务,通过gradleVersion属性指定你想要使用的Gradle版本。
    不要求该任务的名字为wrapper,任何名字都可以。但是这个名字在Gradle的在线文档中使用,是一个默认的约定。

    task wrapper(type: Wrapper) {
        gradleVersion = '3.3'
    }
    

    执行任务 `gradle wrapper' ,就会在构建脚本同级的目录下生成了包装器文件。

     build.gradle*
     gradle/
     .gradle/
     gradlew*
     gradlew.bat
    

    gradle目录中的结构如下:

    image.png

    在gradle-wrapper.properties文件中包含了Wrapper的属性

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
    

    .gradle 是存放下载下来的gradle的目录。

    .gradle中存放文件.png

    记住:只需在项目中运行一次gradle wrapper命令就可以了。而且通常情况下,我们最好把gradle wrapper文件提交到版本控制系统中去。

    3.2 使用包装器

    作为包装器内容的一部分,它提供了一个命令执行脚本。对于 *nix系统,如Linux、Mac Os系统,它是一个叫做gradlew的shell脚本;对于Windows操作系统,它是gradle.bat。使用它们运行构建和使用已安装的Gradle运行时运行构建是一样的。

    gradle生成的脚本.png

    对于android开发,假如我们在android studio中使用命令行工具 ,如clean任务。

    ./gradlew clean  //��Mac OS
    gradlew clean //Windows
    

    更多信息可以查看官方文档Wrapper

    4 Gradle构建块

    每个Gradle构建都包含三个基本构建块:project、task、property。每个构建至少包含一个project,进而包含一个或者多个task。project和task暴露的属性可以用来控制构建。

    Gradle使用的是领域驱动设计(DDD)的原理为其自己的领域构建软件建模。因此,在Gradle API中有相应的类来表示project和task

    Gradle API中有相应的类来表示project和task。这一点是要明确的,Gradle中的脚本实际上是转为代码来执行的。

    4.1 项目Project

    在Gradle术语中,一个项目(project)代表一个正在构建的组件,比如一个JAR文件,或一个想要完成的目标,如部署应用程序。
    当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project接口,并且能够通过project变量使其隐式可用。

    4.2 任务Task

    任务动作 task action,定义了一个当任务执行时最小的工作单元。
    任务依赖 task dependency,很多时候运行一个task之前需要运行另一个task。
    Gradle task对应的API是org.gradle.api.Task 接口。

    4.3 属性 Property

    每个Project和Task实例都提供了可以通过getter和setter方法访问的属性。一个属性可能是一个任务的描述或者项目的版本。
    你也可以定义自己的属性。Gradle允许用户通过扩展属性自定义一些标量。

    5 总结

    本文介绍了Gradle中task的基本使用、命令行的使用、包装器Wrapper的作用以及Gradle构建块的介绍。

    下一篇,我们会开始介绍Project和Task的属性。

    相关文章

      网友评论

        本文标题:Gradle学习2——开始使用Gradle

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