Gradle语法基础解析

 

在从ADT转移到AndroidStudio下开发,必然会遇到Gradle脚本打包的问题.看懂一个脚本最基本的前提就是了解它的语法,我在转移开发环境的过程当中,也开始接触学习Gradle,在此作了一些总结,方便本身查阅.html

Gradle为什么物

第一次接着Gradle,对它作了大体的了解。按照网上广泛的说法:Gradle是以Groovy语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具. 看到这里我依旧仍是有点云里雾里的,不过抓住了两个重点:java

1.Gradle是一门语言 2.Gradle是一个自动化构建工具 既然单从概念上得不到很好的理解,那么做为学习一门语言和一个工具,只能经过使用来加强概念和功能上的了解了.git

Project和Task、Action

Gradle里面的任何东西都是基于Project和Task这两个概念,基于这两个概念,Gradle官方放出的指导手册是这么描述的:github

  • 每个构建都是由一个或多个Project构成的.一个Project到底表明什么依赖于你想用Gradle作什么.举个例子,一个Project能够表明一个JAR或者一个网页应用.它也可能表明一个发布的 ZIP压缩包,这个ZIP多是由许多其余项目的JARs构成的.可是一个Project不必定非要表明被构建的某个东西.它能够表明一件**要作的事,好比部署你的应用.
  • 每个Project是由一个或多个Task构成的.一个Task表明一些更加细化的构建.多是编译一些classes,建立一个JAR,生成javadoc,或者生成某个目录的压缩文件.
  • 每一个Task又是由一个或多个Action构成的,Gradle中有两种类型的Action,分别是doFirst和doLast.

在AndroidStudio构建生成一个apk的安装包,它就要依赖于build.gradle脚本进行构建.此时生成apk包这样一件事情就能够理解成为一个Project(要作一件什么事),而生成apk包只是一个比较大一统的概念.打包的过程须要进行各类各样的配置,例如配置版本号,最低兼容Android几的平台,打包签名等.这些至关于生成apk包这个Project的一个个具体的子步骤,也就是Gradle中的Task.服务器

基础语法

了解大概的一些基本概念以后,最重要的仍是开始下手打码实战,建立本身的第一个Gradle构建脚本文件build.gradlemaven

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

在命令行里,进入脚本所在的文件夹而后输入命令gradle -q hello来执行构建脚本(前提是你安装了Gradle并配置了环境变量),会在控制台窗口获得以下输出ide

$ gradle -q hello
Hello world!

这个命令所执行的事情能够分为如下几个步骤 1.去build.gradle文件中查找hello这个task,而且作编译执行; 2.执行hello task中每一个action里面的流程,此处只有doLast{}一个action负责输出Hello world;函数

接下来看另一段Gradle脚本工具

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

看到此处的代码,须要作一个简单的解释一下,上面的这段代码和下面的这种写法是等价的,上面的写法实际上是Gradle提供的doLast{}的一种简写方式,由于Gradle直接重载了<<符号.

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

看到这里,有没有发现其实Gradle的语法,其实跟Java是很是相似的,哈哈...其实网上也存在着一种说法:Groovy就是没有类型的Java,为何说是Groovy,其实Gradle至关于Groovy的子类,Groovy的全部特性都被Gradle完整继承了.看完下面的代码就能理解为什么成为没有类型的Java的缘由了.

task notype << { def oneInt = 1 //等价于 int oneInt = 1 def oneFloat = 1.00 //等价于 ioneFloat = 1.00 def oneString = 'Clock'//等价于 oneString = 'Clock' println "oneInt: " + oneInt println "oneFloat: " + oneFloat println "oneString: " + oneString }

编译运行以上代码后,便可以看到如下输出

$ gradle -q notype
oneInt: 1
oneFloat: 1.00
oneString: Clock

之因此说Groovy是无类型的Java,就是由于无论全部的类型均可以使用**def(define)**来定义一个变量,Gradle会根据你赋值的类型,将变量转换成对应的基本类型. 最后来看一下Gradle里面如何使用循环的,直接看下面两段代码

task rounder << { 10.times{ println "it is: " + it } }
task rounder << { 10.times{a-> println "it is: " + a } }

上面的两段代码的执行结果相同,以下:

$ gradle -q rounder
it is: 0
it is: 1
it is: 2
it is: 3
it is: 4
it is: 5
it is: 6
it is: 7
it is: 8
it is: 9

都是作一个10次的循环,.times 和 it是关键字,其中**..times**.表示循环,10.times表示执行10次的一个循环,it表示循环中的计数值. 对于it,咱们也能够自定义一个变量获取这个计数值,像第二段代码中的a->就是表示用a来取代it获取这个循环中的计数值.对于

println "it is: " + a

咱们也能够等价写成

println "it is: $a"//$变量名,表示去取变量的值

任务依赖

Gradle中存在一种依赖关系,所谓依赖关系能够简单的描述成一个Task的执行须要已另外一个Task做为基础,继续看下面的两段代码

task hello << { println 'Hello world!' } task intro(dependsOn: hello) << { println "I'm Gradle" }
task intro(dependsOn: 'hello') << { println "I'm Gradle" } task hello << { println 'Hello world!' }

上面两段代码的都是表示在执行intro task以前会先依赖执行hello task,惟一的区别就是被依赖的task是定义在调用以前仍是调用以后,看到这里是否感受这种依赖的关系至关于函数调用传入参数那样..显得很是易懂.

多项目和远程仓库

Gradle支持能够将一个Project划分红为一个或多个子Project来构成

include 'SubProject1','SubProject2','SubProject3'.........;

能够支持使用本地的mavenCentral库,或者是远程服务器上的库

repositories {
    mavenCentral()//本地库支持 maven { url "http://repo.mycompany.com/maven2" //远程库地址 } }

经常使用的Gradle命令

下面介绍一些Gradle中经常使用的命令操做

  • 查看版本号: gradle -v
  • 编译执行某个task: gradle Task名
  • 静默编译执行某个task: gradle -q Task名(q表示quiet模式,表示编译执行Gradle脚本的过程当中,只输出必要的信息. 除了quiet模式外,Gradle中还有其余三种模式)
  • 编译执行某个Project中的某个task:gradle -b Project名 Task名(Gradle默认只执行build.gradle文件中,自定义其余文件xxx.gradle编译运行显式指定Project名称,这里的build.gradle其实表示的就是build Project)
  • 显示全部的Project:gradle projects
  • 显示全部的task:gradle tasks
  • 显示gradle的gui:gradle --gui 或 gradle --gui&(后台运行)
  • 查找全部的gradle命令: gradle --help

##最后

此处只是一小部分gradle的基础使用总结,更多的gradle使用方式请戳这里Gradle User Guide

相关文章
相关标签/搜索