Gradle 可以轻松地在运行时添加任务依赖项。
添加任务依赖性后是否还可以将其删除?
作为一个用例,假设我们希望在单独的管道步骤中运行 checkstyle,而不是作为主构建的一部分。因此,我们应用该checkstyle插件,但这会添加一些依赖于check. 我想打破这种依赖性,以便checkstyle仅在显式运行时运行,而不是作为build(取决于check,取决于checkstyle*)的一部分运行。
为了完成上述任务,我可以将主管道步骤运行为build -x checkstyleMain -x checkstyleTest. 另一种解决方法是将enabledcheckstyle 任务的属性设置为 false。
但对于这个问题,我感兴趣的是一种删除任务依赖关系的通用方法,以便任务图缺少两个任务之间的边缘,就像从未添加依赖关系一样。这个问题并不容易,因为:
gradle.taskGraph.whenReady可能会失败(因为不再允许更改任务图。一个好的答案是,这肯定是不可能的,在这种情况下,我可以向 Gradle 团队提出功能请求。
我尝试将 @Chriki 的 groovy 转换为 kotlin,如下所示:
project.afterEvaluate {
tasks.check {
dependsOn -= tasks.find {
it.name.startsWith("checkstyle")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这行不通。我收到错误:“不支持从任务实例中删除任务依赖项。”
./gradlew bar在以下独立构建上执行将不会运行该foo任务,即使它被声明为依赖项bar(使用 Gradle 7.1 进行测试):
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}\nRun Code Online (Sandbox Code Playgroud)\n在您的情况下,您可以将类似以下内容添加到您的文件中build.gradle,以无条件地从项目中删除不需要的 Checkstyle 任务依赖项check:
project.afterEvaluate {\n check.dependsOn -= checkstyleMain\n check.dependsOn -= checkstyleTest\n}\nRun Code Online (Sandbox Code Playgroud)\n使用 Kotlin DSL,以下内容适用于我上面的构建脚本:
\nproject.afterEvaluate {\n val bar = tasks.findByPath("bar")\n if (bar != null) {\n bar.setDependsOn(bar.dependsOn - listOf(tasks.findByPath("foo"), "foo"))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n重要的是不要使用-=运算符。
请原谅冗长。I\xe2\x80\x99m 确信这可以写得更简洁,但 I\xe2\x80\x99m 在 Kotlin 中不够流畅。
\n| 归档时间: |
|
| 查看次数: |
4601 次 |
| 最近记录: |