Roman Niko
Roman Niko

Reputation: 11

Gradle plugin read configuration

I write a plugin for Gradle and I need to create dynamic tasks based on my extension configuration. Example from build.gradle file:

exampleext {
    t1 {
    }
    t2 {
    }
}

So I want to create tasks like sometask#t1 and sometask#t2 and so on. I could not find any info, how could I read this Closure configuration and use it for building these tasks? It's read in tasks only, but I want to use it before executing tasks. Thanks in advance.

Upvotes: 1

Views: 363

Answers (1)

Tobias Schulte
Tobias Schulte

Reputation: 3805

You could use Groovy's dynamic features:

class ExamplePlugin implements Plugin<Project> {

    void apply(Project project) {
        project.extensions.create("exampleext", ExampleExt, project)
    }
}

class ExampleExt {
    Project project
    ExampleExt(Project project) {
        this.project = project
    }

    def methodMissing(String name, Object args) {
        def configClosure = args ? args[0] : {}
        project.tasks.create(name: "sometask#$name", type: Copy, configClosure)
    }
}


apply plugin: ExamplePlugin

exampleext {
    t1 {
        from "src/main/java"
        into "$buildDir/tmp/main"
    }
    t2 {
        from "src/test/java"
        into "$buildDir/tmp/test"
    }
}

You can have a look at https://github.com/tschulte/gradle-jnlp-plugin/blob/374360c118e2a7373ee2fa5be7d1b784240bb1aa/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/war/GradleJnlpWarPluginExtension.groovy, where I allow dynamic task creation plus some more nesting. E.g.

jnlpWar {
    versions {
        "1.0"('org.example:application:1.0:webstart@zip')
    }
}

is made possible by

void versions(Closure closure) {
    closure.delegate = new Versions()
    closure()
}

private class Versions {
    @Override
    Object invokeMethod(String name, Object args) {
        project.configurations.maybeCreate(name)
        return project.dependencies.invokeMethod(name, args)
    }
}

However, maybe you should have a look at the incubating gradle model (https://docs.gradle.org/current/userguide/software_model.html).

Upvotes: 1

Related Questions