Gradle 脚本剪片---copy

Gradle是以Groovy语言为基础,基于DSL语法的自动化构建工具,一个构建脚本能够包含任何Groovy语言元素,每个脚本都是UTF-8编码的文件。

6-1 Project对象API

前面我们说过,Gradle在构建脚本中定义了一个project,对于构建脚本中每个project其实Gradle都创建了一个 Project类型的对象来关联,当构建脚本执行时它会去配置所关联的Project对象;构建脚本中每个被调用的方法和属性都委托给了当前Project对象。

如下我们看一个使用Project属性的例子:

println name
println project.name

上面两个println语句的输出是一样的;由于name属性没有在当前脚本中定义,所以可以像第一个那样使用自动委托 ,通常我们使用第二中写法。

Project对象提供了一些标准的属性,我们可以在构建脚本中很方便的使用他们,如下:

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"  

6-2 Script对象API

当Gradle执行一个脚本时它会将这个脚本编译为实现了Script的类(在上篇博客《Groovy脚本基础全攻略》Groovy的本质编译class代码那块有介绍),也就是说所有的属性和方法都是在Script的接口中声明。

6-3 Gradle对象API

关于Gradle对象的详细属性和API介绍点我即可。这里直接给出一个使用Gradle对象的例子,如下:

6-4 Gradle变量声明

在Gradle脚本中有两种类型的变量可以声明,如下:

  • 局部变量
  • 扩展变量

局部变量使用关键字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 = "[email protected]"
}

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对象添加两个扩展属性,当这些扩展属性被添加后,它们就像预定义的属性一样可以被读写。

6-5 Gradle中Groovy使用

这个没啥说的,具体可以参考《Groovy脚本基础全攻略》这篇博客,里面有详细介绍。我们这里粗略总结回忆一下即可:

  • Groovy会自动将一个属性的引用转换为相应的getter/setter方法。
  • Groovy调用方法时圆括号可有可无。
  • Groovy为List和Map集合提供了一些操作捷径,譬如apply plugin:’java’中的plugin:’java’其实就是Groovy中的Map,apply是一个方法,省略了括弧而已。

哎呀,详细的还是去看前一篇博客吧。

【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

7 Gradle文件操作基础

实际使用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
时间: 2024-10-08 13:57:52

Gradle 脚本剪片---copy的相关文章

Gradle脚本基础全攻略

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 在开始Gradle之前请务必保证自己已经初步了解了Groovy脚本,特别是闭包规则,如果还不了解Groovy则可以先看<Groovy脚本基础全攻略>这一篇博客速成一下Groovy基础,然后再看此文即可.关于Gradle速成干货基础详情也请参考Geadle官方网站,不好意思我太Low了. Gradle核心是基于Groovy的领域特定语言(DSL,具体概念参见<

看懂Gradle脚本(6)- Hello Groovy, Goodbye Getters&amp;Setters

本篇文章很简单,就是把下面这段Gradle脚本打回原形: version = 1.0 Groovy语法糖 Java程序员对JavaBeans和Getter/Setter方法肯定不陌生,所以就不过多介绍了.虽然现代的IDE都提供了快捷方式,可以很方便的给字段生成Getter和Setter方法,但我还是很讨厌他们.还好,有Groovy的语法糖在手,就可以跟Getter/Setter方法说再见了!上面的脚本,实际上是调用Project接口的setVersion方法: project.setVersio

看懂Gradle脚本(3)- Groovy AST转换

延续上一篇文章 上篇文章末尾有一段脚本,定义了一个Task: task 'myTask' { doLast { println 'hello world!' } } 我们已经知道,这段脚本其实是调用Project的task方法,并且传入两个参数:一个是Task的名字,另外一个是闭包,用来配置Task(在这段脚本中,给Task添加了一个Action). Task名的引号去哪儿了? 但是Gradle官方推荐的写法,是像下面这样定义Task: task myTask { // <-- doLast {

从编程的角度理解gradle脚本??Android Studio脚本构建和编程

本篇文章由嵌入式企鹅圈原创团队.魅族资深工程师degao撰写! 随着Android 开发环境从Eclipse转向Android Studio,我们每个人都开始或多或少要接触gradle脚本,大多数人将gradle看做构建工具,出现问题不知如何着手分析,只能寄希望百度能找到解决方案,其实大可不必. 如果我们把gradle看做编程框架,并理清gradle脚本与gradle对象的关系,通过查阅文档,不但能清晰理解gradle脚本,而且出现问题再也不用百度,通过查阅文档就能轻松解决问题. 本文就通过一个

看懂Gradle脚本(5)- 跟Gradle学领域驱动设计

领域驱动设计(DDD) 如果第一次听说领域驱动设计,那么赶紧买一本,或借一本Eric Evans写的那么同名经典书补一下课.Gradle是一个自动化build工具,所以Gradle面对的领域就是自动化构建这一领域.Gradle是按照DDD的思想设计和开发的,所以自动化构建领域里的大部分概念,在Gradle的源代码里都有一个接口或类与之对应.本文介绍对Gradle新手来说最重要的三个领域对象:Project.Task.Action. Project Project是Gradle最重要的一个领域对象

Gradle脚本打包so库

要让引用的第三方的so库被打包进去,只需要把相关的armeabi文件夹放在libs下面,然后在builld.gradle脚本中加上这一句: sourceSets{ main { jniLibs.srcDirs 'libs' } } 这样就可以把so文件也打包进去了.

看懂Gradle脚本(2)- Groovy语言的闭包语法

本篇文章讨论下面这一小段Gradle脚本: repositories { mavenCentral() } 闭包字面量 闭包字面量看起来像Java里的代码块:用一对儿花括号包起来.前面讨论过,方法调用的圆括号可以省略,补上圆括号之后,脚本看起来是这样: repositories({ // <-- mavenCentral() }) 如果闭包是方法的最后一个参数,那么闭包可以放在圆括号外面 也就是说,上面的代码写成这样也是可以的: repositories() { // <-- mavenCen

看懂Gradle脚本(1)- Groovy语言的Map语法糖

这一系列文章是写给刚开始使用Gradle,并且对Groovy语法不是特别了解的Java程序员看的. 本篇文章的目标是解释清楚下面这行Gradle脚本: apply plugin: 'java' 行尾的分号是可选的 用过JavaScript语言的人对这个语法糖应该比较熟悉,下面是补上分号后的脚本: apply plugin: 'java'; Map字面量(Literal) Java语言只有基本类型.String和数组是有字面量的,如下所示: boolean b = false; int i = 1

gradle脚本运行环境分析(gradle的语义模型)

引言:通过上一篇的论述,我们知道gradle脚本是如假包换的groovy代码,但是这个groovy代码是运行在他的上下文环境里面的,学名叫语义模型.这一篇我们就来看看他的语义模型到底是什么. gradle下载安装 gradle的下载安装并没有什么出乎意料的东西,进入他的官网(http://gradle.org/),下载gradle压缩包,解压,配置bin路径到Path即可. 我安装在c盘下,进入目录C:\gradle-2.4\docs\userguide,打开userguide.pdf文件,这个