gradle:如何删除任务依赖

Cri*_*anu 5 gradle

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

添加任务依赖性后是否还可以将其删除?

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

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

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

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

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

更新1

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

project.afterEvaluate {
    tasks.check {
        dependsOn -= tasks.find {
            it.name.startsWith("checkstyle")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这行不通。我收到错误:“不支持从任务实例中删除任务依赖项。”

Chr*_*iki 0

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

\n
task foo {\n    doFirst {\n        println \'foo\'\n    }\n}\n\n\ntask bar {\n    dependsOn foo\n    doFirst {\n        println \'bar\'\n    }\n}\n\nproject.afterEvaluate {\n    bar.dependsOn -= foo\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
project.afterEvaluate {\n    check.dependsOn -= checkstyleMain\n    check.dependsOn -= checkstyleTest\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
project.afterEvaluate {\n    val bar = tasks.findByPath("bar")\n    if (bar != null) {\n        bar.setDependsOn(bar.dependsOn - listOf(tasks.findByPath("foo"), "foo"))\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

请原谅冗长。I\xe2\x80\x99m 确信这可以写得更简洁,但 I\xe2\x80\x99m 在 Kotlin 中不够流畅。

\n