我的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任务的输入。
答案 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
}