簡體   English   中英

Gradle插件任務的共享@Input屬性,最好是嵌套配置

[英]Shared @Input properties on Gradle Plugin tasks, ideally nested config

我的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/

以馬克的評論為基礎。 這是一個適用於所有任務並且不能被覆蓋(配置)的屬性的示例。

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) {}
        }
    }
}

最常見的約定是使用擴展名來執行此操作。 您似乎已開始執行此操作。 然后,您將在擴展名上定義屬性,然后您的插件將讀取擴展名並在所有相關任務上設置屬性。

myPluginConfig {
    sharedConfig 'value'
}

在您的插件中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM