Gradle插件读取配置

时间:2017-08-28 21:10:49

标签: gradle

我为Gradle编写了一个插件,我需要根据扩展配置创建动态任务。 build.gradle文件中的示例:

exampleext {
    t1 {
    }
    t2 {
    }
}

所以我想创建像sometask#t1和sometask#t2等任务。 我找不到任何信息,我怎么能读这个Closure配置并用它来构建这些任务?它只读取任务,但我想在执行任务之前使用它。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用Groovy的动态功能:

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"
    }
}

您可以查看https://github.com/tschulte/gradle-jnlp-plugin/blob/374360c118e2a7373ee2fa5be7d1b784240bb1aa/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/war/GradleJnlpWarPluginExtension.groovy,其中我允许创建动态任务以及更多嵌套。例如。

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

是可以通过

实现的
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)
    }
}

但是,也许你应该看看孵化的gradle模型(https://docs.gradle.org/current/userguide/software_model.html)。