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.