Dependencies 跳过Gradle中已禁用任务的依赖项执行?

Dependencies 跳过Gradle中已禁用任务的依赖项执行?,dependencies,gradle,Dependencies,Gradle,在跳过某个任务时,是否可能不执行该任务的依赖项 在下面的示例中,如果执行runServerTests时服务器已经在运行,我希望不要执行jar(以及jar的依赖项)。在这种情况下,服务器将由另一个进程启动 apply plugin: 'java' task startServerIfNotRunning(dependsOn: jar) { onlyIf { isServerNotRunning() } ... } task runServerTests(dependsOn: start

在跳过某个任务时,是否可能不执行该任务的依赖项

在下面的示例中,如果执行
runServerTests
时服务器已经在运行,我希望不要执行
jar
(以及
jar
的依赖项)。在这种情况下,服务器将由另一个进程启动

apply plugin: 'java'

task startServerIfNotRunning(dependsOn: jar) {
  onlyIf { isServerNotRunning() }
  ...
}

task runServerTests(dependsOn: startServerIfNotRunning) { ... }

我不希望只在
jar
任务中添加
onlyIf
,因为应该始终执行的其他任务可能取决于该任务。
jar
任务也有自己的依赖项。

要获得所需的行为,必须从任务执行图中排除该任务,而不是跳过其执行。您可以使用命令行中的
-x
或使用
gradle.startParameter.excludedTaskNames…}以编程方式执行此操作

您可以执行以下操作

task startServerIfNotRunning(dependsOn: jar) {
    if (isServerNotRunning()) {
        enabled = false;
        dependsOn = [];
    }
}

if语句将在配置阶段评估,并删除相关任务。我已经用代码和输出总结了这一点。看一看。

我不知道这里的答案,但是如果您的服务器依赖于jar,并且jar已经过期,为什么不重新启动服务器?如果jar是最新的,并且它的所有依赖项都是最新的,那么它不会花费你那么多时间,因为jar任务没有执行任何操作……虽然你有一个观点,但我们确实有很多子项目,所以即使一切都是最新的,也需要大约15-30秒来完成“重新编译”。如果可能的话,这次我想摆脱它。大多数情况下,服务器都是最新的。请参阅右侧,谢谢。我猜这必须在配置阶段完成?是的。在执行阶段,任务执行图不能再被更改。@PeterNiederwieser您能更详细地解释一下或者指出您提到的第二种方法的细节吗?我在相关文档中找不到“userFilter”,请参见
org.gradle.execution.TaskGrapherExecutor.useFilter
。但是,这有一个缺点,那就是
isServerNotRunning()
将在gradle的配置阶段每次调用,而不仅仅是在执行此任务时。否,示例中的代码是在配置阶段执行的,在此阶段,所有任务(当前项目中)都将始终进行配置。任务并不总是被执行,但我不是这么说的。我已经在Gradle2.2.1中验证了这一点,这是本文撰写时的最新版本。你是对的,这是一个缺点。也用旧版本验证了它。我收回我先前的评论。