Skip to content

任务输入与输出

任务的输入(Inputs)和输出(Outputs)是增量构建和构建缓存的基础。Gradle 通过比较输入输出的哈希值来判断是否需要重新执行任务。

声明输入

kotlin
tasks.register("processConfig") {
    // 文件输入
    inputs.file("src/config/app.yml")
    inputs.dir("src/templates")
    inputs.files(fileTree("src/resources") { include("*.properties") })
    
    // 属性输入
    inputs.property("version", project.version)
    inputs.property("encoding", "UTF-8")
    
    doLast {
        // 处理配置文件
    }
}

声明输出

kotlin
tasks.register("processConfig") {
    inputs.file("src/config/app.yml")
    inputs.property("version", project.version)
    
    // 输出文件
    outputs.file("$buildDir/config/app.yml")
    
    // 输出目录
    outputs.dir("$buildDir/config")
    
    // 缓存结果(启用构建缓存)
    outputs.cacheIf { true }
    
    doLast {
        copy {
            from("src/config")
            into("$buildDir/config")
            filter { line -> line.replace("@VERSION@", project.version.toString()) }
        }
    }
}

注解方式(自定义任务类推荐)

kotlin
abstract class BundleTask : DefaultTask() {
    @get:InputFiles
    @get:Classpath
    abstract val classpath: ConfigurableFileCollection
    
    @get:InputDirectory
    abstract val resourceDir: DirectoryProperty
    
    @get:Input
    abstract val mainClass: Property<String>
    
    @get:OutputFile
    abstract val outputJar: RegularFileProperty
    
    @TaskAction
    fun bundle() {
        // 打包逻辑
    }
}

运行时 API(动态声明)

kotlin
tasks.register("dynamicTask") {
    val inputFiles = fileTree("src") { include("**/*.java") }
    val outputDir = file("$buildDir/processed")
    
    inputs.files(inputFiles).withPropertyName("sources")
    outputs.dir(outputDir).withPropertyName("output")
    
    doLast {
        outputDir.mkdirs()
        // 处理逻辑
    }
}

验证输入输出配置

bash
# 查看任务的输入输出
./gradlew myTask --info 2>&1 | grep -E "(Input|Output|UP-TO-DATE)"

下一步