【问题标题】:gradle: how to remove task dependencygradle:如何删除任务依赖
【发布时间】:2021-08-16 09:30:23
【问题描述】:

Gradle 可以轻松地在运行时添加任务依赖项。

添加任务依赖后是否也可以删除它?

作为一个用例,假设我们想在单独的管道步骤中运行 checkstyle,而不是作为主构建的一部分。因此,我们应用了checkstyle 插件,但这增加了一些依赖于check 的任务。我想打破这种依赖关系,以便checkstyle 仅在显式运行时运行,而不是作为build 的一部分(取决于check,这取决于checkstyle*)。

要完成上述操作,我可以以build -x checkstyleMain -x checkstyleTest 运行主管道步骤。 另一种解决方法是将 checkstyle 任务的 enabled 属性设置为 false。

但是对于这个问题,我对删除任务依赖项的通用方法感兴趣,以便任务图缺少 2 个任务之间的边缘,就像从未添加该依赖项一样。 这个问题并不容易,因为:

  • 在添加之前删除依赖项不会有任何影响
  • 尝试删除对gradle.taskGraph.whenReady 的依赖可能会失败(因为不再允许更改任务图。

一个好的答案是这肯定是不可能的,在这种情况下,我可以向 Gradle 团队提出功能请求。

更新 1

我尝试将@Chriki 的 groovy 转换为 kotlin,如下所示:

project.afterEvaluate {
    tasks.check {
        dependsOn -= tasks.find {
            it.name.startsWith("checkstyle")
        }
    }
}

但这不起作用。我收到一个错误:“不支持从任务实例中删除任务依赖项。”

【问题讨论】:

    标签: gradle


    【解决方案1】:

    在以下自包含构建上执行 ./gradlew bar 将不会运行 foo 任务,即使它被声明为 bar 的依赖项(使用 Gradle 7.1 测试):

    task foo {
        doFirst {
            println 'foo'
        }
    }
    
    
    task bar {
        dependsOn foo
        doFirst {
            println 'bar'
        }
    }
    
    project.afterEvaluate {
        bar.dependsOn -= foo
    }
    

    在您的情况下,您可以因此向您的build.gradle 添加类似以下内容,以无条件地从check 任务中删除不需要的 Checkstyle 任务依赖项:

    project.afterEvaluate {
        check.dependsOn -= checkstyleMain
        check.dependsOn -= checkstyleTest
    }
    

    使用 Kotlin DSL,以下内容适用于我上面的构建脚本:

    project.afterEvaluate {
        val bar = tasks.findByPath("bar")
        if (bar != null) {
            bar.setDependsOn(bar.dependsOn - listOf(tasks.findByPath("foo"), "foo"))
        }
    }
    

    重要的是使用-= 运算符。

    请原谅冗长。我确信这可以写得更简洁,但我在 Kotlin 中不够流利。

    【讨论】:

    • 使用 Kotlin 对我不起作用。我收到一个错误(请参阅问题中的更新 1)。除非我在转换到 Kotlin 时犯了错误,否则我认为它在 Groovy 中也不会工作,对吧?
    • 正如我所提到的,我对此进行了测试,它正在使用 Groovy DSL。我已将关键部分翻译成 Kotlin(也已使用 Gradle 7.1 成功测试)。
    • 尝试将依赖关系从“check”删除到“checkstyleMain”是行不通的。 tasks.findByPath("checkstyleMain") 返回一个Checkstyle_Decorated 类,而check.dependsOn 中的项目是AbstractCodeQualityPlugin 的一些匿名内部类,因此减号运算符不会返回任何更少的项目。我现在没有时间调试更多,但是当我有时间时,我会看看这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多