2

给定以下 Gradle-Task/Plugin-Combination

apply plugin: GreetingPlugin

class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create("greeting", GreetingPluginExtension)

        def task = project.task('hello', type: GreetigTask)

        //don't know how/when to populate task-properties with extension-values here.
        //this does NOT work... properites don't get populated
        task.message = {project.greeting.message}
        task.greeter = {project.greeting.greeter}
    }
}

class GreetingPluginExtension {
    String message
    String greeter
}

class GreetigTask extends DefaultTask {

    def message
    def greeter

    @TaskAction
    def greet() {
        println "${message} from ${greeter}"
    }
}

greeting {
    message = 'Hi'
    greeter = 'Gradle'
}

task helloDirect(type: GreetigTask) {
    message = "howdy"
    greeter = "direct task"
}

我想为我的用户提供一个插件,用户可以通过GreetingTask两种不同的方式使用它。

第一种方式

使用配置块GreetingPluginExtension来配置插件提供的任务hello,如下所示:

greeting {
    message = 'Hi'
    greeter = 'Gradle'
}

第二种方式

让用户显式定义/创建任务并在任务定义中设置所需的值,如下所示:

task helloDirect(type: GreetigTask) {
    message = "howdy"
    greeter = "direct task"
}

我刚刚发现我可以直接从-object 使用messageand属性来打印问候语,或者将任务操作更改为 use 。greeterGreetingTaskproject.greeting.message

我怎样才能获得更大的灵活性?我希望我的用户可以选择同时使用两者。

4

1 回答 1

0

看起来我已经找到了一种方法来实现我想要的......

下面只是我改变的部分。问题是,我不知道这是否是实现我想要的 gradle-way(tm),因为这conventionMappings似乎是使用 gradle 的旧/不推荐使用的方式。请参阅:Gradle 插件:约定与扩展以及如何使用约定映射来执行以下操作?(通过 SO:使用 Java 定义 Gradle 插件属性扩展的正确方法?

有人有更好的建议吗?或者这是最好的方法?

conventionMappings似乎没有很好的记录。

class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create("greeting", GreetingPluginExtension)

        def task = project.task('hello', type: GreetigTask) 

        //using conventionMapping here
        task.conventionMapping.message = {project.greeting.message}
        task.conventionMapping.greeter = {project.greeting.greeter}
    }
}
class GreetigTask extends DefaultTask {

    def message
    def greeter

    @TaskAction
    def greet() {
        //excplicitly calling getters and setters here.
        //conventionMapping-properties seem to be evaluated before class properties
        println "${getMessage()} from ${getGreeter()}"
    }
}
于 2013-09-23T10:59:56.317 回答