Slackbot
07/26/2023, 8:23 AMNiels Doucet
07/26/2023, 8:28 AMMarcus Lagergren
07/26/2023, 8:41 AMMarcus Lagergren
07/26/2023, 8:43 AMMarcus Lagergren
07/26/2023, 8:45 AMMarcus Lagergren
07/26/2023, 8:49 AMMarcus Lagergren
07/26/2023, 8:49 AMMarcus Lagergren
07/26/2023, 8:55 AMNiels Doucet
07/26/2023, 9:02 AMMarcus Lagergren
07/26/2023, 9:06 AMNiels Doucet
07/26/2023, 9:22 AMMarcus Lagergren
07/26/2023, 9:22 AMNiels Doucet
07/26/2023, 9:27 AMNiels Doucet
07/26/2023, 9:28 AMoutgoingVariant
task on your lib_collections projectNiels Doucet
07/26/2023, 9:54 AMMarcus Lagergren
07/26/2023, 9:58 AMNiels Doucet
07/26/2023, 10:02 AMproducer-
, not -producer
. producer
is the producing module in this case, right? So in your case it's lib_ecstacy-xtcFeature
. But given that you manually create the capability name, that's what you should require.Marcus Lagergren
07/26/2023, 10:03 AMMarcus Lagergren
07/26/2023, 10:03 AMMarcus Lagergren
07/26/2023, 10:03 AMMarcus Lagergren
07/26/2023, 10:19 AMMarcus Lagergren
07/26/2023, 10:19 AMMarcus Lagergren
07/26/2023, 1:15 PMMarcus Lagergren
07/26/2023, 1:15 PMMarcus Lagergren
07/26/2023, 1:15 PMMarcus Lagergren
07/26/2023, 1:16 PMNiels Doucet
07/26/2023, 1:23 PMMarcus Lagergren
07/26/2023, 1:24 PMMarcus Lagergren
07/26/2023, 1:24 PMMarcus Lagergren
07/26/2023, 1:24 PMMarcus Lagergren
07/26/2023, 1:25 PMMarcus Lagergren
07/26/2023, 1:26 PMMarcus Lagergren
07/26/2023, 2:13 PMVampire
07/26/2023, 3:37 PMMarcus Lagergren
07/28/2023, 2:55 PMMarcus Lagergren
07/28/2023, 2:56 PMMarcus Lagergren
07/28/2023, 2:57 PMMarcus Lagergren
07/28/2023, 4:41 PMVampire
07/28/2023, 11:10 PMMarcus Lagergren
07/29/2023, 6:24 PMVampire
07/31/2023, 1:04 AM./bar/build.gradle.kts
import org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE
import org.gradle.api.attributes.Category.LIBRARY
import org.gradle.api.attributes.LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE
val producerTaskA by tasks.registering {
val output = layout.buildDirectory.file("a.xtc")
outputs.file(output).withPropertyName("output")
doLast {
output.get().asFile.writeText("A XTC content")
}
}
val producerTaskB by tasks.registering {
val output = layout.buildDirectory.file("b.xtc")
outputs.file(output).withPropertyName("output")
doLast {
output.get().asFile.writeText("B XTC content")
}
}
val producerConfiguration by configurations.registering {
isCanBeConsumed = true
isCanBeResolved = false
outgoing.artifact(producerTaskA)
outgoing.artifact(producerTaskB)
attributes {
attribute(CATEGORY_ATTRIBUTE, objects.named(LIBRARY))
attribute(LIBRARY_ELEMENTS_ATTRIBUTE, objects.named("xtc"))
}
}
./bar/settings.gradle.kts
rootProject.name = "bar"
./build.gradle.kts
import org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE
import org.gradle.api.attributes.Category.LIBRARY
import org.gradle.api.attributes.LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE
val consumerConfiguration by configurations.creating {
isCanBeConsumed = false
isCanBeResolved = true
attributes {
attribute(CATEGORY_ATTRIBUTE, objects.named(LIBRARY))
attribute(LIBRARY_ELEMENTS_ATTRIBUTE, objects.named("xtc"))
}
}
dependencies {
consumerConfiguration(":bar")
}
val foo by tasks.registering {
inputs.files(consumerConfiguration)
doLast {
consumerConfiguration.files.forEach {
println()
println(it.name)
println(it.readText())
}
}
}
./settings.gradle.kts
rootProject.name = "foo"
includeBuild("bar")
Output of `gw foo`:
> Task :bar:producerTaskB
> Task :bar:producerTaskA
> Task :foo
a.xtc
A XTC content
b.xtc
B XTC content
Marcus Lagergren
08/15/2023, 3:33 PMMarcus Lagergren
08/15/2023, 3:34 PMval xtcModule = configurations.create("xtcModule") { config ->
config.description = "Configuration that resolves and consumes XTC modules from other projects."
config.isCanBeResolved = true
config.isCanBeConsumed = false
config.attributes {
it.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class.java, Category.LIBRARY))
it.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements::class.java, "xtc"))
//it.attribute(Usage.USAGE_ATTRIBUTE, xtcModuleUsageAttribute)
}
}
val xtcModuleProvider = configurations.create("xtcModuleProvider") { config ->
config.description = "Configuration that provides XTC modules to other projects."
config.isCanBeResolved = false
config.isCanBeConsumed = true
config.outgoing.artifact(zipTask) // TODO is this enough to trigger the build if the resolveable things aren't ready?
config.attributes {
it.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class.java, Category.LIBRARY))
it.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements::class.java, "xtc"))
//it.attribute(Usage.USAGE_ATTRIBUTE, xtcModuleUsageAttribute)
}
}
Marcus Lagergren
08/15/2023, 3:37 PMVampire
08/15/2023, 3:44 PMMarcus Lagergren
08/16/2023, 7:24 AMMarcus Lagergren
08/17/2023, 2:54 PMMarcus Lagergren
08/17/2023, 2:57 PMMarcus Lagergren
08/17/2023, 3:10 PMMarcus Lagergren
08/17/2023, 3:10 PMMarcus Lagergren
08/17/2023, 3:10 PMMarcus Lagergren
08/17/2023, 3:10 PMMarcus Lagergren
08/17/2023, 3:11 PMMarcus Lagergren
08/17/2023, 3:13 PMVampire
08/17/2023, 3:15 PMI wonder if this has to do with my category attributes. Trying to figure out what the “implementation” configuration has as attributes, but it’s kind of hard to find it in the gradle source code.Probably none,
implementation
is not for resolving, so attributes should be irrelevant. You want to have a look at runtimeClasspath
or compileClasspath
.
Yes - adding the inputs.files(consumerConfiguration) to my compile task in the consumer did indeed force the producer to be built.Of course things are only built when needed. Gradle is very good at avoiding unnecessary work. But for that it of course needs to know what are input of a task to then also derive task dependencies from that. If you just resolve your configuration at task execution time, it is too late and Gradle did not know it needed to run something else first. By declaring the configuration as input to the task, it knows that the contents are input for the task and thus can also trigger the necessary tasks.
Marcus Lagergren
08/17/2023, 3:16 PMVampire
08/17/2023, 3:18 PMI wonder if this has to do with my category attributes. Trying to figure out what the “implementation” configuration has as attributes, but it’s kind of hard to find it in the gradle source code.Btw. have a look at the
resolvableConfigurations
task. It lists all resolvable configurations and their attributes.Vampire
08/17/2023, 3:18 PMoutgoingVariants
task, just for outgoingMarcus Lagergren
08/17/2023, 3:21 PMVampire
08/17/2023, 3:23 PMMarcus Lagergren
08/17/2023, 3:28 PMVampire
08/17/2023, 3:31 PMMarcus Lagergren
08/17/2023, 3:32 PMVampire
08/17/2023, 3:33 PMMarcus Lagergren
08/17/2023, 3:34 PMMarcus Lagergren
08/17/2023, 3:37 PMVampire
08/17/2023, 3:37 PMMarcus Lagergren
08/17/2023, 3:45 PMVampire
08/17/2023, 3:58 PMMarcus Lagergren
08/17/2023, 4:20 PMMarcus Lagergren
08/17/2023, 4:20 PMVampire
08/17/2023, 4:21 PMVampire
08/17/2023, 4:21 PMVampire
08/17/2023, 4:21 PMVampire
08/17/2023, 4:23 PMVampire
08/17/2023, 4:26 PMMarcus Lagergren
08/17/2023, 7:47 PMVampire
08/18/2023, 7:52 AM