Gradle无法用overwrite:true覆盖任务

Gradle无法用overwrite:true覆盖任务,gradle,groovy,overriding,overwrite,Gradle,Groovy,Overriding,Overwrite,我想创建一个build.gradle文件,将另一个加载到其中 第二个文件应该只有“defaulttasks”,这意味着它们应该在第一个文件中不存在任务时执行 文件一: apply from ("..otherfile.gradle") task "hello"(overwrite: true) { doFirst{ println "hello from here" } } 第二个文件: task "hello&qu

我想创建一个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”),而不是task

之后,它不会失败,但也会执行第二个。
如何覆盖任务,使默认任务不再运行?

替换完全实现的任务在Gradle 5中被弃用,在Gradle 6中被删除,因此我担心这不再可能

但是,如果使用任务容器的惰性注册方法,则可以执行以下操作

格雷德尔先生 otherfile.gradle
不确定替换任务会使任何事情更容易推理,因此如果你能我会避免它。我尝试了@tim yates提出的解决方法来覆盖插件中定义的任务。在gradle 6.6.1中,我遇到了以下错误:

不支持替换可能已被其他插件使用的现有任务

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

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

tasks.hello.configure {
  onlyIf { false }
}

tasks.hello.dependsOn tasks.helloHere
也就是说,如果执行
hello
任务,则首先运行
helloHere
任务,然后跳过
hello
任务,使其成为noop


是的,这是一种黑客行为,但如果需要,可能会派上用场。

对我来说,比@dpr建议的更短的解决方案有效。您可以避免禁用任务和添加Dependesson任务。使用never版本6.8.2,我可以确认@tim_yates提供的解决方案对我不起作用。即使在脚本插件任务中添加了.r方法引发异常

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

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

“操作列表”已清除,因此之前的所有任务都将被删除,然后您可以定义在触发任务时希望执行的任何操作。

您的解决方案有效。感谢您提供的示例。但究竟为什么需要调用actions.clear()(如果是tasks.replace())正在调用?这不意味着上一个任务被删除。所以新任务不应该附加任何操作。对我来说,这个替换方法没有明确的意图。API已损坏。
task helloHere() {
  doFirst {
    println "hello from here"
  }
}

tasks.hello.configure {
  onlyIf { false }
}

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