gradle:如何删除任务依赖关系

xv8emn3q  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(327)

Gradle使在运行时添加任务依赖关系变得非常容易。
是否也可以在添加任务相关性后将其删除?
作为一个用例,假设我们希望在一个单独的管道步骤中运行checkstyle,而不是作为主构建的一部分。因此,我们应用了checkstyle插件,但这会添加一些依赖于check的任务。我希望打破这种依赖关系,以便checkstyle只在显式运行时运行,而不是作为build的一部分运行(这取决于check,这取决于checkstyle*)。
要完成上述任务,我可以将主管道步骤作为build -x checkstyleMain -x checkstyleTest运行。另一种解决方法是将checkstyle任务的enabled属性设置为false。
但是对于这个问题,我感兴趣的是一种删除任务相关性的通用方法,这样任务图就缺少了两个任务之间的边缘,就像从未添加过相关性一样。这个问题并不容易,因为:

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

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

更新1

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

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

但这不起作用。我得到一个错误:“不支援从工作执行严修移除工作相依性。”

xxhby3vn

xxhby3vn1#

在以下自包含构建上执行./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
}

使用KotlinDSL,下面的代码适用于我上面的构建脚本:

project.afterEvaluate {
    val bar = tasks.findByPath("bar")
    if (bar != null) {
        bar.setDependsOn(bar.dependsOn - listOf(tasks.findByPath("foo"), "foo"))
    }
}
  • 不要 * 使用-=运算符,这一点很重要。

请原谅我的冗长。我相信这可以写得更简洁,但我不是足够流利的Kotlin。

xmd2e60i

xmd2e60i2#

感谢伟大的@Chriki的回答,我也有我的。把它留在这里给别人用。
我正在使用quarkus和注解处理。当升级到新版本时,我有循环依赖关系:

Circular dependency between the following tasks:
:kspKotlin
+--- :quarkusGenerateCode
|    \--- :processResources
|         \--- :kspKotlin (*)
\--- :quarkusGenerateCodeDev
     \--- :processResources (*)

为了解决这个问题,我在build.gradle.kts中使用了以下代码:

project.afterEvaluate {
        tasks.findByPath("application:quarkusGenerateCode")?.let {
            it.setDependsOn(it.dependsOn.map { it as Provider<*> }.filter { it.get() !is ProcessResources })
        }
        tasks.findByPath("application:quarkusGenerateCodeDev")?.let {
            it.setDependsOn(it.dependsOn.map { it as Provider<*> }.filter { it.get() !is ProcessResources })
        }
    }

相关问题