【问题标题】:Gradle cannot overwrite task with overwrite:trueGradle 不能用 overwrite:true 覆盖任务
【发布时间】:2020-11-21 04:27:17
【问题描述】:

我想创建一个 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")

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

【问题讨论】:

    标签: gradle groovy overriding overwrite


    【解决方案1】:

    完全实现的替换任务在 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"
        }
    }
    

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

    【讨论】:

    • 您的解决方案有效。谢谢你的例子。但是,如果调用了tasks.replace(),到底为什么需要调用actions.clear()?这是否意味着先前的任务被删除。因此,新任务不应附加任何操作。对我来说,这种替换方法没有明确的意图。损坏的 API。
    【解决方案2】:

    我尝试了@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 任务是 SKIPPED 使其成为 noop。

    是的,这有点骇人听闻,但如果需要可能会派上用场。

    【讨论】:

      【解决方案3】:

      对我来说,比@dpr 建议的更短的解决方案有效。您可以避免禁用任务并添加dependOn 任务。从来没有版本 6.8.2 我可以确认@tim_yates 提供的解决方案不适合我。即使在脚本插件任务中添加了 .register() 方法也会引发异常。

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

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

      动作列表被清除,所有以前的任务都被删除,然后你可以定义你想在任务被触发时执行的任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-18
        • 2018-07-11
        • 2017-04-06
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多