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")
}
}
}
但这不起作用。我得到一个错误:“不支援从工作执行严修移除工作相依性。”
2条答案
按热度按时间xxhby3vn1#
在以下自包含构建上执行
./gradlew bar
将不会运行foo
任务,即使它已声明为bar
的依赖项(使用Gradle 7.1测试):在您的示例中,可以向
build.gradle
添加类似以下内容的内容,以无条件地从check
任务中删除不需要的Checkstyle任务依赖项:使用KotlinDSL,下面的代码适用于我上面的构建脚本:
-=
运算符,这一点很重要。请原谅我的冗长。我相信这可以写得更简洁,但我不是足够流利的Kotlin。
xmd2e60i2#
感谢伟大的@Chriki的回答,我也有我的。把它留在这里给别人用。
我正在使用
quarkus
和注解处理。当升级到新版本时,我有循环依赖关系:为了解决这个问题,我在
build.gradle.kts
中使用了以下代码: