Gradle 无法用 overwrite:true 覆盖任务

Gradle cannot overwrite task with overwrite:true

我想创建一个 build.gradle 文件,它将加载另一个文件。

第二个文件应该有“defaulttasks”,这意味着它们应该在第一个文件中不存在任务时执行。

文件一:

apply from ("..otherfile.gradle")
task "hello"(overwrite: true) {
  doFirst{
    println "hello from here"
  }
}

第二个文件:

task "hello" {
  doFirst{
    println "i am the old one"
  }
}

当我运行这样做时,它失败了

原因:java.lang.IllegalStateException:不支持替换可能已被其他插件使用的现有任务。为此任务使用不同的名称 ('hello')。

所以我尝试将第二个文件而不是任务更改为 tasks.register("hello")

之后它不会失败,但它还会执行第二个。 我怎样才能重写一个任务,使默认任务不再是 运行ning?

替换已完全实现的任务已在 Gradle 5 中弃用,并在 Gradle 6 中删除,所以恐怕这不再可能了。

但是,如果使用tasks任务容器的惰性register方法,则可以进行如下操作

build.gradle

apply(from: "otherfile.gradle")

tasks.replace("hello").configure {
    actions.clear()
    doFirst{
        println "hello from here"
    }
}

otherfile.gradle

tasks.register("hello") {
    doFirst{
        println "i am the old one"
    }
}

不确定替换任务是否能让任何事情更容易推理,所以如果可以的话我会避免它

我尝试了@tim-yates 提出的解决方法来覆盖插件中定义的任务。使用 gradle 6.6.1 我得到了这个错误:

Replacing an existing task that may have already been used by other plugins is not supported.

我能够通过跳过相应任务的执行并使其依赖于新任务来实现所需的行为:

task helloHere() {
  doFirst {
    println "hello from here"
  }
}

tasks.hello.configure {
  dependsOn helloHere
  onlyIf { false }
}

也就是说,如果hello任务被执行,helloHere任务先运行,hello任务SKIPPED成为noop。

是的,这有点老套,但如果需要的话可能会派上用场。

对我来说,比@dpr 建议的更短的解决方案也能奏效。您可以避免禁用任务并添加 dependsOn 任务。对于 never 版本 6.8.2,我可以确认 @tim_yates 提供的解决方案对我来说不起作用。即使在脚本插件任务中添加了 .register() 方法,也会抛出异常。

现在要覆盖方法,我从脚本插件重新配置现有任务,如下所示:

tasks.hello.configure {
  actions.clear()
  doLast {
    println("")
    println("Action new")
    println("")
  }
}

操作列表被清除,因此所有以前的任务都被删除,然后您可以定义触发任务时要执行的任何内容。