文件集合

文件集合表示一组文件,Gradle 使用 FileCollection 接口表示文件集合, Gradle API 中的许多项目都实现了这个接口,例如 dependency configurations .

获取 FileCollection 实例的一种方法是使用 Project.files() 方法.你可以传递任何数量的对象参数,这个方法能将你传递的对象集合转换为一组文件对象.files() 方法接收任何类型对象参数.每一个 file() 方法都依赖于项目目录(在第 15 章,第一小节中介绍).files()方法也接收 collections, iterables, mapsarrays 类型参数.这些参数的内容会被解析,然后被转换为文件对象.

例 15.2 创建文件集合

build.gradle

  1. FileCollection collection = files('src/file1.txt',
  2. new File('src/file2.txt'),
  3. ['src/file3.txt', 'src/file4.txt'])

文件集合可以被迭代器,使用迭代操作能够将其转换为其他的一些类型.你可以使用 + 操作将两个文件集合合并,使用 - 操作能够对一个文件集合做减法.下面一些例子介绍如何操作文件集合.

例 15.3 使用文件集合

build.gradle

  1. // 对文件集合进行迭代
  2. collection.each {File file ->
  3. println file.name
  4. }
  5. // 转换文件集合为其他类型
  6. Set set = collection.files
  7. Set set2 = collection as Set
  8. List list = collection as List
  9. String path = collection.asPath
  10. File file = collection.singleFile
  11. File file2 = collection as File
  12. // 增加和减少文件集合
  13. def union = collection + files('src/file3.txt')
  14. def different = collection - files('src/file3.txt')

你也可以向 files() 方法专递一个闭合或者可回调的实例参数.当查询集合的内容时就会调用它,然后将返回值转换为一些文件实例.返回值可以是 files() 方法支持的任何类型的对象.下面有个简单的例子来演示实现 FileCollection 接口

例 15.4 实现一个文件集合

build.gradle

  1. task list << {
  2. File srcDir
  3. // 使用闭合创建一个文件集合
  4. collection = files { srcDir.listFiles() }
  5. srcDir = file('src')
  6. println "Contents of $srcDir.name"
  7. collection.collect { relativePath(it) }.sort().each { println it }
  8. srcDir = file('src2')
  9. println "Contents of $srcDir.name"
  10. collection.collect { relativePath(it) }.sort().each { println it }
  11. }

使用 gradle -q list 输出结果

  1. > gradle -q list
  2. Contents of src
  3. src/dir1
  4. src/file1.txt
  5. Contents of src2
  6. src2/dir1
  7. src2/dir2

另外, files() 方法也接收其他类型的参数:

FileCollection

内容损坏的文件包含在文件集合中.

Task

任务的输出文件包含在文件集合中.

TaskOutputs

TaskOutputs 的输出文件包含在文件集合中

值得注意的是当有需要时文件集合的内容会被被惰性处理,就比如一些任务在需要的时候会创建一个 FileCollecion 代表的文件集合.