Gradle是以Groovy语言为基础,基于DSL语法的自动化构建工具,一个构建脚本可以包含任何Groovy语言元素,每一个脚本都是UTF-8编码的文件。html
前面咱们说过,Gradle在构建脚本中定义了一个project,对于构建脚本中每一个project其实Gradle都建立了一个 Project类型的对象来关联,当构建脚本执行时它会去配置所关联的Project对象;构建脚本中每一个被调用的方法和属性都委托给了当前Project对象。java
以下咱们看一个使用Project属性的例子:git
println name println project.name
上面两个println语句的输出是同样的;因为name属性没有在当前脚本中定义,因此能够像第一个那样使用自动委托 ,一般咱们使用第二中写法。github
Project对象提供了一些标准的属性,咱们能够在构建脚本中很方便的使用他们,以下:web
Name | Type | Default Value |
---|---|---|
project | Project | Project实例对象 |
name | String | 项目目录的名称 |
path | String | 项目的绝对路径 |
description | String | 项目描述 |
projectDir | File | 包含构建脚本的目录 |
build | File | projectDir/build |
group | Object | 未具体说明 |
version | Object | 未具体说明 |
ant | AntBuilder | Ant实例对象 |
具体关于Project的方法详情参阅Project的API文档。这里咱们给出Project的apply方法的一个例子,以下:正则表达式
//加载一个gradle文件 apply from: rootProject.getRootDir().getAbsolutePath() + "/common.gradle"
当Gradle执行一个脚本时它会将这个脚本编译为实现了Script的类(在上篇博客《Groovy脚本基础全攻略》Groovy的本质编译class代码那块有介绍),也就是说全部的属性和方法都是在Script的接口中声明。spring
关于Gradle对象的详细属性和API介绍点我便可。这里直接给出一个使用Gradle对象的例子,以下:api
在Gradle脚本中有两种类型的变量能够声明,以下:bash
局部变量使用关键字def声明,它只在声明的地方可见,以下:闭包
def dest = "dest" task copy(type: Copy) { form "source" into dest }
在Gradle中全部被加强的对象能够拥有自定义属性(譬如projects、tasks、source sets等),使用ext扩展块能够一次添加多个属性。以下:
apply plugin: "java" ext { springVersion = "3.1.0.RELEASE" emailNotification = "build@master.org" } sourceSets.all { ext.purpose = null } sourceSets { main { purpose = "production" } test { purpose = "test" } plugin { purpose = "production" } } task printProperties << { println springVersion println emailNotification sourceSets.matching { it.purpose == "production" }.each { println it.name} }
上面咱们用一个ext扩展块向Project对象添加两个扩展属性,当这些扩展属性被添加后,它们就像预约义的属性同样能够被读写。
这个没啥说的,具体能够参考《Groovy脚本基础全攻略》这篇博客,里面有详细介绍。咱们这里粗略总结回忆一下便可:
Groovy会自动将一个属性的引用转换为相应的getter/setter方法。
Groovy调用方法时圆括号无关紧要。
Groovy为List和Map集合提供了一些操做捷径,譬如apply plugin:’java’中的plugin:’java’其实就是Groovy中的Map,apply是一个方法,省略了括弧而已。
哎呀,详细的仍是去看前一篇博客吧。
【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流】
实际使用Gradle过程当中大多数时候须要操做文件,好在Gradle给咱们提供了一些API来快捷处理。
定位文件:
咱们可使用Project.file()方法来定位一个文件获取File对象(详情参考Project的API),以下:
//相对路径 File configFile = file('src/config.xml') //绝对路径 File configFile = file(configFile.absolutePath) //项目路径的文件对象 File configFile = file(new File('src/config.xml'))
能够从Project的API发现file()方法可以接收任何形式的对象参数,它会将参数值转换为一个绝对文件对象,一般咱们能够传一个String或File实例;若是传的路径是绝对路径,则会被直接构造为一个文件实例,不然会被构造为项目目录加上传递目录的文件对象;固然了,file()方法还能识别URL(譬如file:/some/path.xml等)。
文件集合:
文件集合实际上是一组文件,Gradle使用FileCollection接口表示文件集合,Gradle API中许多类都实现了这个接口,譬如dependency configurations等。获取FileCollection实例的一种方法是Project.files(),咱们能够传递任何数量的对象参数。以下:
FileCollection collection = files('src/file1.txt', new File('src/file2.txt'), ['src/file3.txt', 'src/file4.txt'])
使用迭代操做还能将其转换为其余的一些类型,同时咱们还可使用+操做将两个文件集合合并,使用-操做对一个文件集合作减法。以下例子:
// 对文件集合进行迭代
collection.each {File file -> println file.name } // 转换文件集合为其余类型 Set set = collection.files Set set2 = collection as Set List list = collection as List String path = collection.asPath File file = collection.singleFile File file2 = collection as File // 增长和减小文件集合 def union = collection + files('src/file3.txt') def different = collection - files('src/file3.txt')
咱们也能够向files()方法传递闭包或者可回调的实例参数,当查询集合的内容时就会调用它,而后将返回值转换为一些文件实例,返回值能够是files()方法支持的任何类型的对象。以下例子:
task list << {
File srcDir
// 使用闭合建立一个文件集合 collection = files { srcDir.listFiles() } srcDir = file('src') println "Contents of $srcDir.name" collection.collect { relativePath(it) }.sort().each { println it } srcDir = file('src2') println "Contents of $srcDir.name" collection.collect { relativePath(it) }.sort().each { println it } }
文件树:
文件树能够表明一个目录树结构或一个ZIP压缩文件的内容,FileTree继承自FileCollection,因此咱们能够像处理文件集合同样处理文件树,使用Project.fileTree()方法能够获得FileTree实例,它会建立一个基于基准目录的对象。以下:
/以一个基准目录建立一个文件树
FileTree tree = fileTree(dir: 'src/main') // 添加包含和排除规则 tree.include '**/*.java' tree.exclude '**/Abstract*' // 使用路径建立一个树 tree = fileTree('src').include('**/*.java') // 使用闭合建立一个数 tree = fileTree('src') { include '**/*.java' } // 使用map建立一个树 tree = fileTree(dir: 'src', include: '**/*.java') tree = fileTree(dir: 'src', includes: ['**/*.java', '**/*.xml']) tree = fileTree(dir: 'src', include: '**/*.java', exclude: '**/*test*/**') // 遍历文件树 tree.each {File file -> println file } // 过滤文件树 FileTree filtered = tree.matching { include 'org/gradle/api/**' } // 合并文件树A FileTree sum = tree + fileTree(dir: 'src/test') // 访问文件数的元素 tree.visit {element -> println "$element.relativePath => $element.file" }
咱们还可使用ZIP或TAR等压缩文件的内容做为文件树,Project.zipTree()和Project.tarTree()方法能够返回一个FileTree实例。以下:
// 使用路径建立一个ZIP文件 FileTree zip = zipTree('someFile.zip') // 使用路径建立一个TAR文件 FileTree tar = tarTree('someFile.tar') //TarTree能够根据文件扩展名获得压缩方式,若是咱们想明确的指定压缩方式则能够以下操做 FileTree someTar = tarTree(resources.gzip('someTar.ext'))
指定输入文件:
Gradle中有些对象的属性能够接收一组输入文件,譬如JavaComplile任务的source属性(定义编译的源文件)。以下:
//使用一个File对象设置源目录 compile { source = file('src/main/java') } //使用一个字符路径设置源目录 compile { source = 'src/main/java' } //使用一个集合设置多个源目录 compile { source = ['src/main/java', '../shared/java'] } //使用FileCollection或者FileTree设置源目录 compile { source = fileTree(dir: 'src/main/java').matching {include 'org/gradle/api/**'} } //使用闭包设置源目录 compile { source = { // Use the contents of each zip file in the src dir file('src').listFiles().findAll {it.name.endsWith('.zip')}.collect { zipTree(it) } } } compile { //使用字符路径添加源目录 source 'src/main/java', 'src/main/groovy' //使用File对象添加源目录 source file('../shared/java') //使用闭包添加源目录 source { file('src/test/').listFiles() } }
复制文件:
咱们可使用复制任务(Copy)进行文件复制操做,复制任务扩展性很强,它能够过滤复制文件的内容,使用复制任务要提供想要复制的源文件和一个目标目录,若是要指定文件被复制时的转换方式则可使用复制规则,复制规则是一个CopySpec接口的实现,咱们使用CopySpec.from()方法指定源文件,CopySpec.into()方法指定目标目录便可。以下:
task copyTask(type: Copy) {
from 'src/main/webapp' into 'build/explodedWar' } task anotherCopyTask(type: Copy) { //复制src/main/webapp目录下的全部文件 from 'src/main/webapp' //复制一个单独文件 from 'src/staging/index.html' //复制一个任务输出的文件 from copyTask //显式使用任务的outputs属性复制任务的输出文件 from copyTaskWithPatterns.outputs //复制一个ZIP压缩文件的内容 from zipTree('src/main/assets.zip') //指定目标目录 into { getDestDir() } } task copyTaskWithPatterns(type: Copy) { from 'src/main/webapp' into 'build/explodedWar' include '**/*.html' include '**/*.jsp' exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') } } task copyMethod << { copy { from 'src/main/webapp' into 'build/explodedWar' include '**/*.html' include '**/*.jsp' } } //在复制时重命名文件 task rename(type: Copy) { from 'src/main/webapp' into 'build/explodedWar' //使用闭包映射文件名 rename { String fileName -> fileName.replace('-staging-', '') } // 使用正则表达式映射文件名 rename '(.+)-staging-(.+)', '$1$2' rename(/(.+)-staging-(.+)/, '$1$2') }
文件同步任务:
同步任务(Sync)继承自复制任务(Copy),当执行时会复制源文件到目标目录,而后从目标目录删除全部非复制文件。以下:
task libs(type: Sync) { from configurations.runtime into "$buildDir/libs" }
建立归档文件:
使用归档任务能够建立Zip、Tar、Jar、War、Ear等归档文件,以下:
apply plugin: 'java' task zip(type: Zip) { from 'src/dist' into('libs') { from configurations.runtime } }ps:http://blog.csdn.net/yanbober/article/details/49314255