(2)Gradle构建

1. 构建块

Gradle构建中的两个基本概念是项目(project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保他们的执行顺序。

《(2)Gradle构建》

1.1 项目

我们能够使用以下配置文件对Gradle的构建进行配置:

  • Gradle构建脚本(build.gradle)指定了一个项目和它的任务。
  • Gradle属性文件(gradle.properties)用来配置构建属性。
  • Gradle设置文件(gradle.settings)对于只有一个项目的构建而言是可选的,如果我们的构建中包含多于一个项目,那么它就是必须的,因为它描述了哪一个项目参与构建。每一个多项目的构建都必须在项目结构的根目录中加入一个设置文件。

Gradle为每个build.gradle都会创建一个相应的Project领域对象,在编写Gradle脚本时,我们实际上是在操作诸如Project这样的Gradle领域对象。在多Project的项目中,我们会操作多个Project领域对象。

当构建启动后,gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用,也就是所有变量、方法的调用都在project。如下面两句话是一样的:

group = 'com.abc.gradle'
project.group = 'com.abc.gradle'

调用的是Project类的setGroup():

《(2)Gradle构建》

【项目重要属性】

项目几个重要的属性:group、name、version,这三个属性是一个项目的坐标。

  • group属性指定依赖的分组(在Maven中,就是groupId)。
  • name属性指定依赖的名称(在Maven中,就是artifactId)。
  • version属性指定外部依赖的版本(在Maven中,就是version)。

我们假设我们需要指定以下依赖:

  • 依赖的分组是foo。
  • 依赖的名称是foo。
  • 依赖的版本是0.1。
  • 在项目编译时需要这些依赖。

我们可以将以下代码片段加入到build.gradle中,进行依赖声明:

dependencies {
    compile group: 'foo', name: 'foo', version: '0.1'
}

我们也可以采用一种快捷方式声明依赖:[group]:[name]:[version]。如果我们想用这种方式,我们可以将以下代码段加入到build.gradle中:

dependencies {
    compile 'foo:foo:0.1'
}

我们也可以在同一个配置项中加入多个依赖,传统的方式如下:

dependencies {
    compile (
        [group: 'foo', name: 'foo', version: '0.1'],
        [group: 'bar', name: 'bar', version: '0.1']
    )
}

如果采用快捷方式,那可以是这样:

dependencies {
    compile 'foo:foo:0.1', 'bar:bar:0.1'
}

自然地,声明属于不同配置项的依赖也是可以的。比如说,如果我们想要声明属于compile和testCompile配置项的依赖,可以这么做:

dependencies {
    compile group: 'foo', name: 'foo', version: '0.1'
    testCompile group: 'test', name: 'test', version: '0.1'
}

同样的,给力的快捷方式又来了( ̄︶ ̄)

dependencies {
    compile 'foo:foo:0.1'
    testCompile 'test:test:0.1'
}

【项目重要的方法】

(1)apply:应用一个插件

(2)dependencies:声明项目依赖于哪些jar包或其他项目

(3)repositories:去哪个仓库找依赖的jar包,在仓库里面根据group、name、version确定一个组件

一个Java项目总会依赖于第三方,要么是一个第三方类库,比如Apache commons;要么是你自己开发的另外一个Java项目,比如你的web项目依赖于另一个核心的业务项目。通常来说,这种依赖的表示形式都是将第三方的Jar文件放在自己项目的classpath下,要么是编译时的classpath,要么是运行时的classpath。

在声明对第三方类库的依赖时,我们需要告诉Gradle在什么地方去获取这些依赖,即配置Gradle的Repository。在配置好依赖之后,Gradle会自动地下载这些依赖到本地。Gradle可以使用Maven和Ivy的Repository,同时它还可以使用本地文件系统作为Repository。

要配置Maven的Repository是非常简单,首先我们先了解以下概念。

名称解释
工件坐标工件可以简单地理解为一个jar包。坐标就是三个属性:group、name、version。通过这三个属性可以唯一确定一个jar包。
常用仓库存储jar包的地方。常用的仓库有:mavenLocal/mavenCentral/jcenter、自定义maven仓库、文件仓库(基本不怎么使用)。

要配置仓库,我们只需要在build.gradle文件中加入以下代码即可:

repositories{   // 配置仓库,可以配置多个仓库,按照仓库的顺序去查找jar包
   maven{
      url '私服地址'
   }
   mavenLocal()   
   mavenCentral()  
}

mavenLocal就是本地仓库:

《(2)Gradle构建》

mavenCentral就是下面这个网站:

《(2)Gradle构建》

在这个网站搜索想要添加的依赖,复制粘贴到到build.gradle即可添加依赖:

《(2)Gradle构建》

有了仓库,我们就可以为Gradle配置依赖:

dependencies{
   testCompile group:'junit',name:'junit',version:'4.11'  // 配置依赖
}

(4)task:声明项目里面有什么任务

dependencies、repositories等都定义在project里面:

《(2)Gradle构建》

1.2 任务

任务主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件。

让我们来看一个最简单的Task,创建一个build.gradle文件,内容如下:

task helloWorld << {
   println "Hello World!"
}

这里的“<<”表示向helloWorld中加入执行代码——其实就是groovy代码。Gradle向我们提供了一整套DSL,所以在很多时候我们写的代码似乎已经脱离了groovy,但是在底层依然是执行的groovy。比如上面的task关键字,其实就是一个groovy中的方法,而大括号之间的内容则表示传递给task()方法的一个闭包。除了“<<”之外,我们还很多种方式可以定义一个Task。

在默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloWorld的Task,在执行gradle命令时,我们指定执行这个helloWorld Task。这里的helloWorld是一个DefaultTask类型的对象,这也是定义一个Task时的默认类型,当然我们也可以显式地声明Task的类型,甚至可以自定义一个Task类型。

在与build.gradle相同的目录下执行:

gradle helloWorld

命令行输出如下:

:helloWorld
Hello World!

BUILD SUCCESSFUL

Total time: 2.544 secs

任务里面重要的方法:

  • dependsOn:声明任务依赖。Task之间可以存在依赖关系,比如taskA依赖于taskB,那么在执行taskA时,Gradle会先执行taskB,然后再执行taskA。声明Task依赖关系的一种方式是在定义一个Task的时候:
task taskA(dependsOn: taskB) {
   //do something
}
  • doFirst、doLast<<:doFirst在任务列表最前面添加一个动作,doLast在任务列表最后面添加一个动作。一个任务可以执行多次doFirst、doLast。

Gradle还默认为我们提供了dependencies、projects和properties等Task。dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property。在默认情况下,Gradle已经为Project添加了很多Property,我们可以调用以下命令进行查看:

gradle properties

在IDEA右侧栏我们可以看到Gradle的任务:

《(2)Gradle构建》

双击这个Task我们就可以执行指定的Taks,效果和gradle [taskName]命令医院。

我们执行jar任务的时候发现前面还执行了其他三个任务,说明jar依赖于这三个任务。任务后面的“UP-TO-DATE”意思是最新的,上次构件之后这个任务的输入输出并没有改变,所以这个是跳过的并没有执行。

《(2)Gradle构建》

2. 构建生命周期

《(2)Gradle构建》

配置:如def …这些就是配置代码,在配置阶段执行。
执行:如doFirst、doLast这些动作代码会在执行阶段执行。

Gradle还为我们提供了构造方法,在初始化完成、配置完成、执行完成都有一个构造方法。

《(2)Gradle构建》

    原文作者:zoyoto
    原文地址: https://www.jianshu.com/p/4b8f2c615e0a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞