I don't know if it is possible to get the service registry in an ad-hoc task using the DSLs. But if you are OK with implementing your tasks as concrete classes (which can still be done in the DSLs if you like), you can inject even internal Gradle services.
For a Kotlin class, it could look like this:
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.logging.text.StyledTextOutput.Style
import org.gradle.internal.logging.text.StyledTextOutputFactory
import javax.inject.Inject
open class MyTask @Inject constructor(private val styledTextOutputFactory: StyledTextOutputFactory) : DefaultTask() {
@TaskAction
fun doStuff() {
val out = styledTextOutputFactory.create(javaClass.name)
out.withStyle(Style.Info).println("colored text")
}
}
tasks.register<MyTask>("myTask") // DSL