Gradle无法用overwrite:true覆盖任务
我想创建一个build.gradle文件,将另一个加载到其中 第二个文件应该只有“defaulttasks”,这意味着它们应该在第一个文件中不存在任务时执行 文件一: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
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("")
}
}