gradle--第十五章 使用文件1

Gradle文件操作详解
本文深入探讨了Gradle中文件定位和文件集合的使用方法,包括如何使用Project.file()方法定位工程相关的文件,以及如何创建和操作文件集合,实现文件的高效管理和利用。

大部分的构建工作中都会用到文件,Gradle也提供了一些这方面的概念已经文件的API操作接口。
15.1 定位文件
你可以使用Project.file()方法来定位一个和工程相关的文件
Example 15.1. Locating files


build.gradle
// Using a relative path
File configFile = file('src/config.xml')


// Using an absolute path
configFile = file(configFile.absolutePath)


// Using a File object with a relative path
configFile = file(new File('src/config.xml'))
你可以给file()方法传递任何对象,它会尝试把这个值转换为一个绝对的文件对象。一般情况下,我们通常传递一个String的文件实例。如果这个路径是绝对路径,文件方法将会使用他来构建一个File实例。否则的话,会创建一个由工程目录到当前目录的文件。file()方法也可以识别URLs,例如一个/some/path.xml文件。
使用这个方法在把一个路径值转变为一个绝对文件时是非常有用的。它比使用newFile(somepath)方法更好,因为file()方法会估计提供的路径相对域工程目录的一个关系。而不是当前的工作目录,这个工作目录会随着用户运行Gradle在那里而改变。
15.2 文件集合
一个文件集合通常是许多的文件,它由FileCollection文件接口来表示。在Gradle API中许多对象都实现了这个方法。例如依赖配置实现了FileCollection接口。
一个获取FileCollection实例的方法是使用Project.files()方法。你可以给这个方法传递任意数量的对象,这些对象后面都会转化为文件对象。files()方法接受任意类型的对象作为其参数。这些参数都被预估为跟工程目录有关系,就像file()方法一样,在 Section 15.1, “Locating files”具体描述。你可以传递集合,迭代器,maps以及数据给files方法。这些内容都会转化为文件实例。
Example 15.2. Creating a file collection


build.gradle
FileCollection collection = files('src/file1.txt',
                                  new File('src/file2.txt'),
                                  ['src/file3.txt', 'src/file4.txt'])
一个文件集合就是一个迭代器,可以通过操作符把它转化为其它类型。你也可以使用+操作符把两个集合合并起来,或者使用-操作符从一个文件集合获取另外一个文件集合。下面是一些使用文件集合的例子:
Example 15.3. Using a file collection


build.gradle
// Iterate over the files in the collection
collection.each {File file ->
    println file.name
}


// Convert the collection to various types
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


// Add and subtract collections
def union = collection + files('src/file3.txt')
def different = collection - files('src/file3.txt')
你也可以给files()方法传递一个闭包或者一个可以回调的实例。这个闭包或回调将会被调用在集合的内容需要的时候。它的返回值会被转化为一系列的文件实例。返回的值类型可以是任意files方法提供的类型。这是实现FileCollection 接口的一个简单方法。
Example 15.4. Implementing a file collection


build.gradle
task list << {
    File srcDir


    // Create a file collection using a closure
    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 }
}
Output of gradle -q list
> gradle -q list
Contents of src
src/dir1
src/file1.txt
Contents of src2
src2/dir1
src2/dir2
其他一些你可以传递给files()方法的参数:
FileCollection
这些包含文件集合的内容
Task
任务的输出文件包含在文件集合中
TaskOutputs
TaskOutputs的输出内容包含在文件集合中
有一点需要特别注意的是,文件集合中的内容是懒惰求值的,只有在需要的时候才会去创建文件。这意味着你可以创建一个FileCollection来表示一些文件,这些文件将会在将来的某个时候由其他任务创建。
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值