Gradle Plugin任务上的共享@Input属性,理想情况是嵌套的配置

时间:2015-04-24 06:46:18

标签: groovy gradle

我的gradle插件会生成许多具有共享配置的任务。此配置需要标记为@Input,因此当它更改时,任务将被标记为陈旧并重新评估。我发现在应用于多个任务时共享配置很有挑战性。我使用避免project.afterEvaluate来允许增量编译。这个例子是我现在拥有的简化版本:

当前插件代码:

class MyPluginTaskOne extends DefaultTask {
    @Input config = "default"
    @TaskAction
    public void action() {
        // something that depends on config
    }
}

class MyPluginTaskTwo extends DefaultTask {
    @Input config = "default"
    @TaskAction
    public void action() {
        // something that depends on config
    }
}

class MyPluginExtension {
    // blank for now
}

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create("myPluginConfig", MyPluginExtension)
        project.tasks.create(name: 'myPluginTaskOne', type: MyPluginTaskOne) {}
        project.tasks.create(name: 'myPluginTaskTwo', type: MyPluginTaskTwo) {}
    }
}

当前配置:

目前,我必须分享国家的最佳方式如下。问题在于它容易出错,并且不会自动共享设置:

apply plugin: MyPlugin

// Kludgy way of sharing configuration across two tasks:
def sharedConfig = "SHARED-CONFIG"

myPluginTaskOne {
    config sharedConfig
}

myPluginTaskTwo {
    config sharedConfig
}

首选配置:

我想要做的是类似以下的配置,但具有跟踪@Input依赖关系和最新测试的所有好处。

myPluginConfig {
    config "SHARED-CONFIG"
    // myPluginTaskOne and myPluginTaskTwo both gets automatic
    // 'SHARED-CONFIG' through Gradle
}

您似乎可以在任务之间自动添加依赖关系(参见下文)。是否可以仅配置第一个任务,然后将@Input细流到第二个任务的@Input?

让我们依靠CopySpec.from()如何使用Project.files()计算参数来尝试删除任务依赖项。 Gradle可以自动为我们添加任务依赖项。这还会将生成器任务的输出添加为zip任务的输入。

来自https://gradle.org/feature-spotlight-incremental-builds/

2 个答案:

答案 0 :(得分:2)

以Mark的评论为基础。以下是适用于所有任务且无法覆盖(属性)的属性示例。

class MyPluginTaskOne extends DefaultTask {
    @Input String getConfig() { project.myPluginConfig.config }
    @TaskAction
    public void action() {
        // something that depends on config
    }
}

class MyPluginTaskTwo extends DefaultTask {
    @Input String getConfig() { project.myPluginConfig.config }
    @TaskAction
    public void action() {
        // something that depends on config
    }
}

class MyPluginExtension {
    String config
}

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.with { 
            extensions.create("myPluginConfig", MyPluginExtension)
            tasks.create(name: 'myPluginTaskOne', type: MyPluginTaskOne) {}
            tasks.create(name: 'myPluginTaskTwo', type: MyPluginTaskTwo) {}
        }
    }
}

答案 1 :(得分:0)

最常见的惯例是使用扩展来执行此操作。看起来你已经开始这样做了。然后,您将在扩展名上定义属性,然后您的插件将读取扩展名并在所有相关任务上设置属性。

myPluginConfig {
    sharedConfig 'value'
}

在你的插件中:

def extension = extensions.create("myPluginConfig", MyPluginExtension)
project.afterEvaluate {
    // read prop from `extension` and set prop on tasks
}