Appearance
任务输入与输出
任务的输入(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)"