gradle杂述

gradle就是groovy

groovy是一种运行在jvm上的与Java语法兼容的动态语言,语法简洁,非常适合作为脚本语言。大家可自行去了解下,对于Java码农而言,几乎无学习曲线。

** 请注意:gradle的构建配置文件build.gradle中的内容实际上都是groovy代码 **

Project

在gradle中,一个构建的项都是一个project(项目)。在多模块的Java项目中,每个模块都是一个子项目。

每个build.gradle文件实际上都会对应到一个project实例。启动gradle构建时,gradle会根据该次构建使用的build.gradle文件创建一个类型为org.gradle.api.Project的实例,名称为project,并隐式将此实例暴露给build.gradle,使得在build.gradle文件中可以直接访问该project实例中的属性和方法。

org.gradle.api.Project中定义了很多方法,如:


void apply(Map<String, ?> var1);
void repositories(Closure var1);
void dependencies(Closure var1);

在build.gradle中对应我们常见的:

//应用插件
apply plugin: 'java' //groovy语法调用project的apply方法,传入一个map参数

//定义依赖的类库从哪里获取
repositories { //groovy语法调用project的repositories 方法,传入一个闭包参数
    mavenCentral() //指定从maven中央仓库
}

//定义项目的依赖
dependencies { //groovy语法调用project的dependencies  方法,传入一个闭包参数
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

依赖

在Gradle中,依赖都被会分配到某一个具体的configuration中。Configuration代表着一个或多个构件及构件所需依赖的一个分组。

Java插件已经预定义了一些configuration,比如,compile,runtime,testCompile,testRuntime等。

compile 放在这个configuration下的依赖是在编译产品代码时所使用的,但它作为一个分组,包含产品代码和编译所需的依赖。
runtime 产品代码在运行时需要的依赖,默认,也会包含compile中的依赖。
testCompile 编译测试代码时所需要的依赖,默认,被编译的产品代码和产品代码需要的编译依赖也属于该分组。
testRuntime 运行测试时需要的依赖。默认,包含compile,runtime和testCompile的分组的构建和依赖。

使用过Maven的都应该知道分组的含义,这里讲解给不明白的同学,依赖之所以要分组,是因为,每个阶段对依赖的需要不一样,最明显的是产品代码和测试代码,比如junit在产品代码中就不需要。

Task

任务,用来处理构建逻辑,对应org.gradle.api.Task,你可以在task中写任何java/groovy代码。在project中调用task方法可以创建task;可以创建多个task。

task print{
    //任务配置代码,在构建的配置阶段执行
    def a=1
    System.out.println("task config,"+a)

    //任务的动作代码,在执行task时执行
    doFirst{
            println("first")
    }

    doLast {
        println("last")
    }

}

上面的脚本调用了project的task方法,创建了一个名称为print的task,每个task的代码分为配置部分和动作部分,所有task的配置代码,在构建的配置阶段执行,任务的动作代码写在doFirst或doLast中,在执行task时执行。
执行task print,可以看到如下输出:

task config,1
:print
first
last

buildScript配置块

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "net.saliman:gradle-cobertura-plugin:2.2.2"
    }
}
```

这样子很容易让人奇怪,为什么repositories要声明两次哪?buildscript代码块中的声明与下半部分声明有什么不同?

buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等。而在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。比如我要在一个task的动作中写Java代码,这些Java代码要用到jdbc的jar包,那么就需要在buildscript中去声明。

类似的,其他配置块实际上都是groovy脚本,都能找到gradle对应的对象,明白了这点,结合gradle的Api很多gradle的配置就能看懂了。



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