Markus Maier
09/23/2025, 8:24 AMCopy task with data from a file produced by another task. Currently that's done by cross-configuring the second task from the first. I'm trying to find a better way, but so far have come up empty. Do you have any pointers for me, or am I stuck with using cross-configuration?Vampire
09/23/2025, 8:44 AMabstract class Foo : DefaultTask() {
@get:OutputFile
abstract val output: RegularFileProperty
@TaskAction
fun execute() {
output.get().asFile.writeText(
"""
gradlew
gradlew.bat
""".trimIndent()
)
}
}
val foo by tasks.registering(Foo::class) {
output = layout.buildDirectory.file("foo.txt")
}
val sync by tasks.registering(Sync::class) {
from(foo.flatMap { it.output }.map { it.asFile.readLines() })
into(layout.buildDirectory.dir("synced"))
}Markus Maier
09/23/2025, 8:52 AMfrom(foo.flatMap { it.output }.map { it.asFile.readLines() }). I was trying something similar, but couldn't get it to work, since I need to configure the `include`sVampire
09/23/2025, 8:59 AMinclude { ... }, all others need a String eagerly:
abstract class Foo : DefaultTask() {
@get:OutputFile
abstract val output: RegularFileProperty
@TaskAction
fun execute() {
output.get().asFile.writeText(
"""
gradlew
gradlew.bat
""".trimIndent()
)
}
}
val foo by tasks.registering(Foo::class) {
output = layout.buildDirectory.file("foo.txt")
}
val sync by tasks.registering(Sync::class) {
inputs.files(foo).withPropertyName("fooOutput")
from(layout.projectDirectory)
into(layout.buildDirectory.dir("synced"))
include {
it.file.name in foo.flatMap { it.output }.get().asFile.readLines()
}
}Markus Maier
09/23/2025, 9:00 AMMarkus Maier
09/23/2025, 9:10 AMVampire
09/23/2025, 9:24 AMabstract class Foo : DefaultTask() {
@get:OutputFile
abstract val output: RegularFileProperty
@TaskAction
fun execute() {
output.get().asFile.writeText(
"""
gradlew
gradlew.bat
""".trimIndent()
)
}
}
val foo by tasks.registering(Foo::class) {
output = layout.buildDirectory.file("foo.txt")
}
val sync by tasks.registering(Sync::class) {
inputs.files(foo).withPropertyName("fooOutput")
from(layout.projectDirectory)
into(layout.buildDirectory.dir("synced"))
val includes = objects
.listProperty<String>()
.value(foo.flatMap { it.output }.map { it.asFile.readLines() })
.apply { finalizeValueOnRead() }
include {
it.file.name in includes.get()
}
}Markus Maier
09/23/2025, 9:25 AMVampire
09/23/2025, 9:26 AMabstract class Foo : DefaultTask() {
@get:OutputFile
abstract val output: RegularFileProperty
@TaskAction
fun execute() {
output.get().asFile.writeText(
"""
gradlew
gradlew.bat
""".trimIndent()
)
}
}
val foo by tasks.registering(Foo::class) {
output = layout.buildDirectory.file("foo.txt")
}
val sync by tasks.registering(Sync::class) {
from(layout.projectDirectory)
into(layout.buildDirectory.dir("synced"))
val includes = objects
.listProperty<String>()
.value(foo.flatMap { it.output }.map { it.asFile.readLines() })
.apply { finalizeValueOnRead() }
inputs.property("includes", includes)
include {
it.file.name in includes.get()
}
}Markus Maier
09/23/2025, 9:38 AMapply comes fromMarkus Maier
09/23/2025, 9:39 AMVampire
09/23/2025, 9:41 AMtap insteadVampire
09/23/2025, 9:42 AMincludes.finalizeValueOnRead() as separate statementMarkus Maier
09/23/2025, 9:43 AMvoid return, now I get why this is usefulVampire
09/23/2025, 9:43 AMMarkus Maier
09/23/2025, 9:44 AMVampire
09/23/2025, 9:46 AMMarkus Maier
09/23/2025, 9:47 AMVampire
09/23/2025, 9:48 AMVampire
09/23/2025, 9:48 AMVampire
09/23/2025, 9:48 AMMarkus Maier
09/23/2025, 10:36 AM