Skip to content

文件集合

文件集合(File Collections)是 Gradle 中表示一组文件的核心概念,支持懒加载和过滤。

ConfigurableFileCollection

kotlin
// 创建文件集合
val myFiles: ConfigurableFileCollection = files(
    "a.txt",
    file("b.txt"),
    fileTree("src") { include("**/*.java") }
)

// 添加到集合
myFiles.from("c.txt")
myFiles.from(configurations["runtimeClasspath"])

// 获取所有文件
myFiles.files.forEach { println(it) }

// 转换为路径列表
val paths = myFiles.asPath  // 路径以 : 分隔(Unix)或 ; 分隔(Windows)

FileTree

kotlin
// 基础文件树
val srcTree = fileTree("src") {
    include("**/*.java", "**/*.kt")
    exclude("**/generated/**", "**/test/**")
}

// 过滤
val mainSources = srcTree.matching {
    include("main/**")
}

// 遍历
srcTree.visit { element ->
    if (element.isDirectory) {
        println("目录:${element.path}")
    } else {
        println("文件:${element.path},大小:${element.file.length()}")
    }
}

懒加载文件集合

kotlin
// 使用 Provider(推荐,避免配置阶段计算)
val outputFiles = layout.buildDirectory.files("output.jar", "output-sources.jar")

tasks.register("myTask") {
    val inputs = files(provider {
        fileTree("src") { include("**/*.java") }
    })
    inputs.files(inputs)
    
    doLast {
        inputs.files.forEach { println(it) }
    }
}

SourceDirectorySet(源码集使用)

kotlin
// 访问 Java 插件的源码集
val mainSources: SourceDirectorySet = sourceSets.main.get().java
println(mainSources.srcDirs)   // [src/main/java]
println(mainSources.files.size)

下一步