[英]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任務的輸入。
以馬克的評論為基礎。 這是一個適用於所有任務並且不能被覆蓋(配置)的屬性的示例。
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.