Slackbot
09/13/2022, 8:36 AMFleshgrinder
09/13/2022, 8:43 AMBuildServiceProvider
or Gradle will try to serialize it. The easiest way in a task to achieve this is:
class MyTask : DefaultTask() {
lateinit var srv: Provider<MyService>
}
val srvProvider = gradle.shared...registerIfAbsent...
tasks.withType<MyTask>().configureEach {
srv = srvProvider
usesService(srvProvider)
}
Obviously both lateinit
and var
look ugly and might be misused, an alternative:
abstract class MyTask : DefaultTask() {
abstract val srv: Property<Provider<MyService>>
}
val srvProvider = gradle.shared...registerIfAbsent...
tasks.withType<MyTask>().configureEach {
srv.value(srvProvider).finalizeValue()
usesService(srvProvider)
}
UNTESTED!Nikolay
09/13/2022, 8:51 AMNikolay
09/13/2022, 8:51 AMNikolay
09/13/2022, 8:52 AMBuildServiceProvider
itself has the following code:
// TODO:configuration-cache - complain when used at configuration time, except when opted in to this
@SuppressWarnings("rawtypes")
public class BuildServiceProvider<T extends BuildService<P>, P extends BuildServiceParameters> extends AbstractMinimalProvider<T> implements Managed {
Fleshgrinder
09/13/2022, 9:00 AMregisterIfAbsent
to an actual BuildServiceProvider
of the correct type. This allowed us to pass them on to worker actions. Maybe the same hack is necessary for configuration cache compatibility?
class MyBuildService : BuildService<MyBuildService.Parameters> {
interface Parameters
}
typealias MyBuildServiceProvider = BuildServiceProvider<MyBuildService, MyBuildService.Parameters>
@Suppress("UNCHECKED_CAST")
val myServiceProvider = gradle.shared...registerIfAbsent... as MyBuildServiceProvider
class MyTask : DefaultTask() {
val myBuildService: Property<MyBuildServiceProvider>
}
Again UNTESTED and written from the top of my head.Nikolay
09/13/2022, 9:12 AMCould not determine the dependencies of task ':services:notifications:notifications-dao:generateJooq'.
> Could not create task ':services:notifications:notifications-dao:migrateDbTask'.
> Cannot set the value of task ':services:notifications:notifications-dao:migrateDbTask' property 'postgres' of type org.gradle.api.services.internal.BuildServiceProvider using a provider of type com.paxos.gradle.EmbeddedPostgresService.
Fleshgrinder
09/13/2022, 9:13 AMEmbeddedPostgresService
is not a BuildServiceProvider
, what is it?Nikolay
09/13/2022, 9:15 AMProvider<EmbeddedPostgresService>
from registerIfAbsent
that I am casting to Provider<BuildServiceProvider<EmbeddedPostgresService, EmbeddedPostgresService.Params>>
Fleshgrinder
09/13/2022, 9:16 AMBuildServiceProvider<EmbeddedPostgresService, EmbeddedPostgresService.Params>
without the surrounding Provider
. The signature of registerIfAbsent
claims to return a plain Provider
but it actually returns a BuildServiceProvider
.Nikolay
09/13/2022, 9:18 AMFleshgrinder
09/13/2022, 9:18 AMNikolay
09/13/2022, 9:18 AMFleshgrinder
09/13/2022, 9:19 AMinstanceof
check somewhere for this, and that should evaluate to true as long as nobody turns that original Provider
into something else.